manicresin
Joined: 15 May 2007 Posts: 24
|
Posted: Wed Aug 13, 2008 3:06 am Post subject: Screen Capture with System tray and gui |
|
|
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 |
|