AutoHotkey Homepage AutoHotkey Community
Let's help each other out
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Screen Capture with System tray and gui

 
Post new topic   Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions
View previous topic :: View next topic  
Author Message
manicresin



Joined: 15 May 2007
Posts: 24

PostPosted: Wed Aug 13, 2008 3:06 am    Post subject: Screen Capture with System tray and gui Reply with quote

I wrote this a while ago for a larger script.
I used Sean's ScreenCapture.ahk for the most part.
Added a little bit so it would work by its self.
Just thought it would be useful and people could let me know were I could improve.

Code:

#Persistent
#SingleInstance Force
;--------------------------------Check INI-----------------------------------
IfNotExist %A_WorkingDir%\ScreenCap.ini
   {
   FileAppend,
   (
   [ScreenCap]`nSS_FileType=1`nSS_ScreenSize=1`nSS_Folder=%A_Desktop%`nSS_FileName=`n
   ),%A_WorkingDir%\ScreenCap.ini
   }
;--------------------------------Check INI-----------------------------------
IniRead SS_FileType, %A_WorkingDir%\ScreenCap.ini, ScreenCap, SS_FileType
IniRead SS_ScreenSize, %A_WorkingDir%\ScreenCap.ini, ScreenCap, SS_ScreenSize
IniRead SS_Folder, %A_WorkingDir%\ScreenCap.ini, ScreenCap, SS_Folder
IniRead SS_FileName, %A_WorkingDir%\ScreenCap.ini, ScreenCap, SS_FileName

if Folder =
{
   SS_Folder = %A_Desktop%
}
Else
{
   SS_Folder = %SS_Folder%
}

;--------------------------------Tray Menu------------------------------------
Menu, Tray, Icon, C:\WINDOWS\system32\winlogon.exe ,1
Menu, Tray, NoStandard
Menu, Tray, add, Cap, ScreenCap
Menu, Tray, add, Menu, Menu
Menu, Tray, add,
Menu, Tray, add, Close, Close
Return
;---------------------------------Menu----------------------------------------
Menu:
Gui 1:+Theme -SysMenu
Gui 1:Add, Text, x5 y+10 , File Type:
Gui 1:Add, DropDownList, x5 y+5 w160 vSS_FileType Choose%SS_FileType% AltSubmit, JPG|PNG|GIF|TIF|BMP
Gui 1:Add, Text, x5 y+5, Screen Shot Type:
Gui 1:Add, DropDownList, x5 y+5 w160 vSS_ScreenSize Choose%SS_ScreenSize% AltSubmit, Full Screen|Active Window|Active Window Contents
Gui 1:Add, Text, x5 y+5, Save Folder`n(If blank, file will save to desktop):
Gui 1:Add, Edit, x5 y+5 w100 r1 -Multi -Wrap vSS_Folder, %SS_Folder%
Gui 1:Add, Button, x+1 w60 h20 gBrowse2 -Wrap, Browse
Gui 1:Add, Text, x5 y+5, Custom Filename`n(If blank, a date/time will be used):
Gui 1:Add, Edit, x5 y+5 w160 r1 -Multi -Wrap vSS_Filename, %SS_Filename%
Gui 1:Add, Button, x5 y+5 w77 gSave -Wrap, Save
Gui 1:Add, Button, x+7 w77 gCancel -Wrap, Cancel
Gui 1:Show, w170, ScreenCap Settings
Return

Browse2:
Gui 1:+OwnDialogs
FileSelectFolder, Folder,,,Select folder to save Screen Shots
GuiControl ,, SS_Folder, %Folder%
Return

Save:
Gui 1:Submit
Gui 1:Destroy
InIWrite %SS_FileType%, %A_WorkingDir%\ScreenCap.ini, ScreenCap, SS_FileType
IniWrite %SS_ScreenSize%, %A_WorkingDir%\ScreenCap.ini, ScreenCap, SS_ScreenSize
IniWrite %SS_Folder%, %A_WorkingDir%\ScreenCap.ini, ScreenCap, SS_Folder
IniWrite %SS_FileName%, %A_WorkingDir%\ScreenCap.ini, ScreenCap, SS_FileName
Return

Cancel:
Gui 1:Destroy
Return

Close:
ExitApp
Return
;--------------------------Sean's modified ScreenCapture--------------------------
^PrintScreen::
ScreenCap:
Gui 1:Submit, nohide
FormatTime, TimeString, ,MMddyyyyHHmmss

If SS_FileType = 1
{
   SS_FileType = .JPG
}
Else If SS_FileType = 2
{
   SS_FileType = .PNG
}
Else If SS_FileType = 3
{
   SS_FileType = .GIF
}
Else If SS_FileType = 4
{
   SS_FileType = .TIF
}
Else If SS_FileType = 5
{
   SS_FileType = .BMP
}
Else
{
   SS_FileType = .JPG
}

If SS_ScreenSize = 1
{
   aRect = 0
}
Else If SS_ScreenSize = 2
{
   aRect = 1
}
Else If SS_ScreenSize = 3
{
   aRect = 2
}
Else
{
   aRect = 0
}

if SS_FileName =
{
   SS_FileName = %TimeString%
}
Else
{
   SS_FileName = %SS_FileName%
}

if Folder =
{
   SS_Folder = %A_Desktop%
}
Else
{
   SS_Folder = %SS_Folder%
}

bCursor = False

sFile = %SS_Folder%\%SS_FileName%%SS_FileType%


{
   If   !aRect
   {
      SysGet, Mon, Monitor, 1
      nL := MonLeft
      nT := MonTop
      nW := MonRight - MonLeft
      nH := MonBottom - MonTop
   }
   Else If   aRect = 1
      WinGetPos, nL, nT, nW, nH, A
   Else If   aRect = 2
   {
      WinGet, hWnd, ID, A
      VarSetCapacity(rt, 16, 0)
      DllCall("GetClientRect" , "Uint", hWnd, "Uint", &rt)
      DllCall("ClientToScreen", "Uint", hWnd, "Uint", &rt)
      nL := NumGet(rt, 0, "int")
      nT := NumGet(rt, 4, "int")
      nW := NumGet(rt, 8)
      nH := NumGet(rt,12)
   }
   Else
   {
      StringSplit, rt, aRect, `,, %A_Space%%A_Tab%
      nL := rt1
      nT := rt2
      nW := rt3 - rt1
      nH := rt4 - rt2
      znW := rt5
      znH := rt6
   }

   mDC := DllCall("CreateCompatibleDC", "Uint", 0)
   hBM := CreateDIBSection(mDC, nW, nH)
   oBM := DllCall("SelectObject", "Uint", mDC, "Uint", hBM)
   hDC := DllCall("GetDC", "Uint", 0)
   DllCall("BitBlt", "Uint", mDC, "int", 0, "int", 0, "int", nW, "int", nH, "Uint", hDC, "int", nL, "int", nT, "Uint", 0x40000000 | 0x00CC0020)
   DllCall("ReleaseDC", "Uint", 0, "Uint", hDC)
   If   bCursor
      CaptureCursor(mDC, nL, nT)
   DllCall("SelectObject", "Uint", mDC, "Uint", oBM)
   DllCall("DeleteDC", "Uint", mDC)
   If   znW && znH
      hBM := Zoomer(hBM, nW, nH, znW, znH)
   If   sFile = 0
      SetClipboardData(hBM)
   Else   Convert(hBM, sFile), DllCall("DeleteObject", "Uint", hBM)
}

CaptureCursor(hDC, nL, nT)
{
   VarSetCapacity(mi, 20, 0)
   mi := Chr(20)
   DllCall("GetCursorInfo", "Uint", &mi)
   bShow   := NumGet(mi, 4)
   hCursor := NumGet(mi, 8)
   xCursor := NumGet(mi,12)
   yCursor := NumGet(mi,16)

   VarSetCapacity(ni, 20, 0)
   DllCall("GetIconInfo", "Uint", hCursor, "Uint", &ni)
   xHotspot := NumGet(ni, 4)
   yHotspot := NumGet(ni, 8)
   hBMMask  := NumGet(ni,12)
   hBMColor := NumGet(ni,16)

   If   bShow
      DllCall("DrawIcon", "Uint", hDC, "int", xCursor - xHotspot - nL, "int", yCursor - yHotspot - nT, "Uint", hCursor)
   If   hBMMask
      DllCall("DeleteObject", "Uint", hBMMask)
   If   hBMColor
      DllCall("DeleteObject", "Uint", hBMColor)
}

Zoomer(hBM, nW, nH, znW, znH)
{
   mDC1 := DllCall("CreateCompatibleDC", "Uint", 0)
   mDC2 := DllCall("CreateCompatibleDC", "Uint", 0)
   zhBM := CreateDIBSection(mDC2, znW, znH)
   oBM1 := DllCall("SelectObject", "Uint", mDC1, "Uint",  hBM)
   oBM2 := DllCall("SelectObject", "Uint", mDC2, "Uint", zhBM)
   DllCall("SetStretchBltMode", "Uint", mDC2, "int", 4)
   DllCall("StretchBlt", "Uint", mDC2, "int", 0, "int", 0, "int", znW, "int", znH, "Uint", mDC1, "int", 0, "int", 0, "int", nW, "int", nH, "Uint", 0x00CC0020)
   DllCall("SelectObject", "Uint", mDC1, "Uint", oBM1)
   DllCall("SelectObject", "Uint", mDC2, "Uint", oBM2)
   DllCall("DeleteDC", "Uint", mDC1)
   DllCall("DeleteDC", "Uint", mDC2)
   DllCall("DeleteObject", "Uint", hBM)
   Return   zhBM
}

Convert(sFileFr = "", sFileTo = "")
{
   If   sFileTo  =
      sFileTo := A_ScriptDir . "\screen.bmp"
   SplitPath, sFileTo, , sDirTo, sExtTo, sNameTo

   If Not   hGdiPlus := DllCall("LoadLibrary", "str", "gdiplus.dll")
      Return   sFileFr+0 ? SaveHBITMAPToFile(sFileFr, sDirTo . "\" . sNameTo . ".bmp") : ""
   VarSetCapacity(si, 16, 0), si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", "UintP", pToken, "Uint", &si, "Uint", 0)

   If   !sFileFr
   {
      DllCall("OpenClipboard", "Uint", 0)
      If    DllCall("IsClipboardFormatAvailable", "Uint", 2) && (hBM:=DllCall("GetClipboardData", "Uint", 2))
      DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", hBM, "Uint", 0, "UintP", pImage)
      DllCall("CloseClipboard")
   }
   Else If   sFileFr Is Integer
      DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", sFileFr, "Uint", 0, "UintP", pImage)
   Else   DllCall("gdiplus\GdipLoadImageFromFile", "Uint", Unicode4Ansi(wFileFr,sFileFr), "UintP", pImage)

   DllCall("gdiplus\GdipGetImageEncodersSize", "UintP", nCount, "UintP", nSize)
   VarSetCapacity(ci, nSize)
   DllCall("gdiplus\GdipGetImageEncoders", "Uint", nCount, "Uint", nSize, "Uint", &ci)
   Loop,   %nCount%
   {
      If   !InStr(Ansi4Unicode(NumGet(ci, 76 * (A_Index - 1) + 44)), "." . sExtTo)
         Continue
      pCodec := &ci + 76 * (A_Index - 1)
         Break
   }

   If   pImage
      pCodec   ? DllCall("gdiplus\GdipSaveImageToFile", "Uint", pImage, "Uint", Unicode4Ansi(wFileTo,sFileTo), "Uint", pCodec, "Uint", 0) : DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "Uint", pImage, "UintP", hBitmap, "Uint", 0) . SetClipboardData(hBitmap), DllCall("gdiplus\GdipDisposeImage", "Uint", pImage)

   DllCall("gdiplus\GdiplusShutdown" , "Uint", pToken)
   DllCall("FreeLibrary", "Uint", hGdiPlus)
}

CreateDIBSection(hDC, nW, nH, bpp = 32, ByRef pBits = "")
{
   NumPut(VarSetCapacity(bi, 40, 0), bi)
   NumPut(nW, bi, 4)
   NumPut(nH, bi, 8)
   NumPut(bpp, NumPut(1, bi, 12, "UShort"), 0, "Ushort")
   NumPut(0,  bi,16)
   Return   DllCall("gdi32\CreateDIBSection", "Uint", hDC, "Uint", &bi, "Uint", 0, "UintP", pBits, "Uint", 0, "Uint", 0)
}

SaveHBITMAPToFile(hBitmap, sFile)
{
   DllCall("GetObject", "Uint", hBitmap, "int", VarSetCapacity(oi,84,0), "Uint", &oi)
   hFile:=   DllCall("CreateFile", "Uint", &sFile, "Uint", 0x40000000, "Uint", 0, "Uint", 0, "Uint", 2, "Uint", 0, "Uint", 0)
   DllCall("WriteFile", "Uint", hFile, "int64P", 0x4D42|14+40+NumGet(oi,44)<<16, "Uint", 6, "UintP", 0, "Uint", 0)
   DllCall("WriteFile", "Uint", hFile, "int64P", 54<<32, "Uint", 8, "UintP", 0, "Uint", 0)
   DllCall("WriteFile", "Uint", hFile, "Uint", &oi+24, "Uint", 40, "UintP", 0, "Uint", 0)
   DllCall("WriteFile", "Uint", hFile, "Uint", NumGet(oi,20), "Uint", NumGet(oi,44), "UintP", 0, "Uint", 0)
   DllCall("CloseHandle", "Uint", hFile)
}

SetClipboardData(hBitmap)
{
   DllCall("GetObject", "Uint", hBitmap, "int", VarSetCapacity(oi,84,0), "Uint", &oi)
   hDIB :=   DllCall("GlobalAlloc", "Uint", 2, "Uint", 40+NumGet(oi,44))
   pDIB :=   DllCall("GlobalLock", "Uint", hDIB)
   DllCall("RtlMoveMemory", "Uint", pDIB, "Uint", &oi+24, "Uint", 40)
   DllCall("RtlMoveMemory", "Uint", pDIB+40, "Uint", NumGet(oi,20), "Uint", NumGet(oi,44))
   DllCall("GlobalUnlock", "Uint", hDIB)
   DllCall("DeleteObject", "Uint", hBitmap)
   DllCall("OpenClipboard", "Uint", 0)
   DllCall("EmptyClipboard")
   DllCall("SetClipboardData", "Uint", 8, "Uint", hDIB)
   DllCall("CloseClipboard")
}

Unicode4Ansi(ByRef wString, sString)
{
   nSize := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
   VarSetCapacity(wString, nSize * 2)
   DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize)
   Return   &wString
}

Ansi4Unicode(pString)
{
   nSize := DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "Uint", 0, "int",  0, "Uint", 0, "Uint", 0)
   VarSetCapacity(sString, nSize)
   DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "Uint", pString, "int", -1, "str", sString, "int", nSize, "Uint", 0, "Uint", 0)
   Return   sString
}
Return
;-----------------------------------------------------------------------------------------------------------


Last edited by manicresin on Thu Aug 14, 2008 1:55 am; edited 2 times in total
Back to top
View user's profile Send private message
joebodo



Joined: 28 Apr 2008
Posts: 45

PostPosted: Wed Aug 13, 2008 8:30 am    Post subject: Reply with quote

Thanks for the script. It made it to my startups folder (and that's saying something).

One small bug:

Code:
if Folder =
{
   SS_Folder = %A_Desktop%
}
Else
{
   SS_Folder = %SS_Folder%
}


Change to if SS_Folder
Back to top
View user's profile Send private message
manicresin



Joined: 15 May 2007
Posts: 24

PostPosted: Thu Aug 14, 2008 1:54 am    Post subject: Reply with quote

I'm glad it help someone,
Thank for the tip I'm updating the code now.
Back to top
View user's profile Send private message
manicresin



Joined: 15 May 2007
Posts: 24

PostPosted: Thu Aug 14, 2008 1:57 am    Post subject: Reply with quote

Also that code i used had the ability to only capture regions, I didn't have a need to write the functionality into my script but I'm sure it wouldn't be that hard to do if someone really wanted to.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions All times are GMT
Page 1 of 1

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum


Powered by phpBB © 2001, 2005 phpBB Group