1 | #include-once |
---|
2 | #include "StdLib\WindowsConstants.au3" ; << MAKES A LOT OF SCREENCAPTURE.AU3 CONSTANTS USELESS (eg. $SM_CXSCREEN, $SRCCOPY, $CAPTUREBLT) |
---|
3 | #include "StdLib\WinAPI.au3" |
---|
4 | #include "StdLib\ScreenCapture.au3" |
---|
5 | |
---|
6 | ;Opt("MustDeclareVars", 1) |
---|
7 | |
---|
8 | Global Const $__SCREENCAPTURECONSTANT_DEFAULT_BITBLT_FLAG = BitOR($SRCCOPY, $CAPTUREBLT) |
---|
9 | |
---|
10 | |
---|
11 | ; #FUNCTION# ==================================================================================================================== |
---|
12 | ; Name...........: _ScreenCapture_CaptureV2 |
---|
13 | ; Description ...: Captures a region of the screen |
---|
14 | ; Syntax.........: _ScreenCapture_Capture([$sFileName = ""[, $iLeft = 0[, $iTop = 0[, $iRight = -1[, $iBottom = -1[, $fCursor = True[, $iBitBltFlag = Default]]]]]]]) |
---|
15 | ; Parameters ....: $sFileName - Full path and extension of the image file |
---|
16 | ; $iLeft - X coordinate of the upper left corner of the rectangle |
---|
17 | ; $iTop - Y coordinate of the upper left corner of the rectangle |
---|
18 | ; $iRight - X coordinate of the lower right corner of the rectangle. If this is -1, the current screen |
---|
19 | ; +width will be used. |
---|
20 | ; $iBottom - Y coordinate of the lower right corner of the rectangle. If this is -1, the current screen |
---|
21 | ; +height will be used. |
---|
22 | ; $fCursor - If True the cursor will be captured with the image |
---|
23 | ; $iBitBltFlag - Flag to pass to the _WinAPI_BitBlt operation (default it BitOR($SRCCOPY, $CAPTUREBLT)) |
---|
24 | ; Return values .: See remarks |
---|
25 | ; Author ........: Paul Campbell (PaulIA) |
---|
26 | ; History .......: OCT 25, 2011 - Added $iBitBltFlag parameter. It uses $CAPTUREBLT by default in order to capture layered windows |
---|
27 | ; Remarks .......: If FileName is not blank this function will capture the screen and save it to file. If FileName is blank, this |
---|
28 | ; function will capture the screen and return a HBITMAP handle to the bitmap image. In this case, after you are |
---|
29 | ; finished with the bitmap you must call _WinAPI_DeleteObject to delete the bitmap handle. |
---|
30 | ;+ |
---|
31 | ; Requires GDI+: GDI+ requires a redistributable for applications that |
---|
32 | ; run on the Microsoft Windows NT 4.0 SP6, Windows 2000, Windows 98, and Windows Me operating systems. |
---|
33 | ; Related .......: _WinAPI_DeleteObject, _ScreenCapture_SaveImage |
---|
34 | ; Link ..........: |
---|
35 | ; Example .......: Yes |
---|
36 | ; =============================================================================================================================== |
---|
37 | Func _ScreenCapture_CaptureV2($sFileName = "", $iLeft = 0, $iTop = 0, $iRight = -1, $iBottom = -1, $fCursor = True, $iBitBltFlag = Default) |
---|
38 | If $iRight = -1 Then $iRight = _WinAPI_GetSystemMetrics($SM_CXSCREEN) |
---|
39 | If $iBottom = -1 Then $iBottom = _WinAPI_GetSystemMetrics($SM_CYSCREEN) |
---|
40 | If $iRight < $iLeft Then Return SetError(-1, 0, 0) |
---|
41 | If $iBottom < $iTop Then Return SetError(-2, 0, 0) |
---|
42 | If $iBitBltFlag = Default Then $iBitBltFlag = $__SCREENCAPTURECONSTANT_DEFAULT_BITBLT_FLAG |
---|
43 | |
---|
44 | Local $iW = ($iRight - $iLeft) + 1 |
---|
45 | Local $iH = ($iBottom - $iTop) + 1 |
---|
46 | Local $hWnd = _WinAPI_GetDesktopWindow() |
---|
47 | Local $hDDC = _WinAPI_GetDC($hWnd) |
---|
48 | Local $hCDC = _WinAPI_CreateCompatibleDC($hDDC) |
---|
49 | Local $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iW, $iH) |
---|
50 | _WinAPI_SelectObject($hCDC, $hBMP) |
---|
51 | _WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, $iBitBltFlag) |
---|
52 | |
---|
53 | If $fCursor Then |
---|
54 | Local $aCursor = _WinAPI_GetCursorInfo() |
---|
55 | If $aCursor[1] Then |
---|
56 | Local $hIcon = _WinAPI_CopyIcon($aCursor[2]) |
---|
57 | Local $aIcon = _WinAPI_GetIconInfo($hIcon) |
---|
58 | _WinAPI_DeleteObject($aIcon[4]) ; delete bitmap mask return by _WinAPI_GetIconInfo() |
---|
59 | _WinAPI_DrawIcon($hCDC, $aCursor[3] - $aIcon[2] - $iLeft, $aCursor[4] - $aIcon[3] - $iTop, $hIcon) |
---|
60 | _WinAPI_DestroyIcon($hIcon) |
---|
61 | EndIf |
---|
62 | EndIf |
---|
63 | |
---|
64 | _WinAPI_ReleaseDC($hWnd, $hDDC) |
---|
65 | _WinAPI_DeleteDC($hCDC) |
---|
66 | If $sFileName = "" Then Return $hBMP |
---|
67 | |
---|
68 | _ScreenCapture_SaveImage($sFileName, $hBMP) |
---|
69 | _WinAPI_DeleteObject($hBMP) |
---|
70 | EndFunc ;==>_ScreenCapture_CaptureV2 |
---|
71 | |
---|
72 | ; #FUNCTION# ==================================================================================================================== |
---|
73 | ; Name...........: _ScreenCapture_CaptureWndV2 |
---|
74 | ; Description ...: Captures a screen shot of a specified window. This function is an alternative to '_ScreenCapture_CaptureWnd'. |
---|
75 | ; It is able to take screenshots of layered windows (drawn by the graphic card). See 'remarks' below. |
---|
76 | ; Syntax.........: _ScreenCapture_CaptureWndV2($sFileName, $hWnd[, $iLeft = 0[, $iTop = 0[, $iRight = -1[, $iBottom = -1[, $fCursor = True[, $iBitBltFlag = Default]]]]]]) |
---|
77 | ; Parameters ....: $sFileName - Full path and extension of the image file |
---|
78 | ; $hWnd - Handle to the window to be captured |
---|
79 | ; $iLeft - X coordinate of the upper left corner of the client rectangle |
---|
80 | ; $iTop - Y coordinate of the upper left corner of the client rectangle |
---|
81 | ; $iRight - X coordinate of the lower right corner of the rectangle |
---|
82 | ; $iBottom - Y coordinate of the lower right corner of the rectangle |
---|
83 | ; $fCursor - If True the cursor will be captured with the image |
---|
84 | ; $iBitBltFlag - Flag to pass to the _WinAPI_BitBlt operation (default it BitOR($SRCCOPY, $CAPTUREBLT)) |
---|
85 | ; Return values .: See remarks |
---|
86 | ; Remarks .......: 1/ If FileName is not blank this function will capture the screen and save it to file. If FileName is blank, this |
---|
87 | ; function will capture the screen and return a HBITMAP handle to the bitmap image. In this case, after you are |
---|
88 | ; finished with the bitmap you must call _WinAPI_DeleteObject to delete the bitmap handle. All coordinates are in |
---|
89 | ; client coordinate mode. |
---|
90 | ; |
---|
91 | ; 2.1/ Layered windows do not appear on screenshots taken by '_ScreenCapture_Capture' because it uses the desktop's |
---|
92 | ; handle whereas the layered windows are drawn directly by the graphic card. 2.2/ '_ScreenCapture_CaptureWnd' |
---|
93 | ; is a wrapper of '_ScreenCapture_Capture' and, therefore, has the same limitations. 2.3/ Instead, |
---|
94 | ; '_ScreenCapture_CaptureWndV2', THIS FUNCTION, is using the handle of the targetted window to perfom its task |
---|
95 | ; (in a similar way than '_ScreenCapture_Capture'uses the Desktop's handle). |
---|
96 | ; |
---|
97 | ; Author ........: Patryk Szczepankiewicz (pszczepa at gmail dot com) |
---|
98 | ; History .......: JAN 21, 2009 - Created |
---|
99 | ; OCT 18, 2010 - First release on the AutoIT forum |
---|
100 | ; OCT 28, 2010 - Cleaned the border code and fixed the capture of the cursor. |
---|
101 | ; APR 06, 2011 - Updated for AutoIT 3.3.6.1 |
---|
102 | ; OCT 25, 2011 - Added $iBitBltFlag parameter. It uses $CAPTUREBLT by default in order to capture layered windows |
---|
103 | ; Related .......: _WinAPI_DeleteObject |
---|
104 | ; Link ..........; http://www.autoitscript.com/forum/index.php?showtopic=65008 |
---|
105 | ; Example .......; No |
---|
106 | ; Credits .......: Based on Paul Campbell's '_ScreenCapture_Capture' function and inspired by Jennico's '_WinGetBorderSize'. |
---|
107 | ; =============================================================================================================================== |
---|
108 | Func _ScreenCapture_CaptureWndV2($sFileName, $hWnd, $iLeft = 0, $iTop = 0, $iRight = -1, $iBottom = -1, $fCursor = True, $iBitBltFlag = Default) |
---|
109 | |
---|
110 | Local $tRect |
---|
111 | Local $iWndX, $iWndY, $iWndW, $iWndH |
---|
112 | |
---|
113 | Local $tClient |
---|
114 | Local $iBorderV, $iBorderT |
---|
115 | Local $iPicHeight, $iPicWidth |
---|
116 | Local $iPicCursorX, $iPicCursorY |
---|
117 | |
---|
118 | |
---|
119 | Local $hDDC, $hCDC, $hBMP, $aCursor, $aIcon, $hIcon |
---|
120 | |
---|
121 | ; Default parameters |
---|
122 | If $iBitBltFlag = Default Then $iBitBltFlag = $__SCREENCAPTURECONSTANT_DEFAULT_BITBLT_FLAG |
---|
123 | |
---|
124 | ; Get the absolute coordinates of the window |
---|
125 | $tRect = _WinAPI_GetWindowRect($hWnd) |
---|
126 | |
---|
127 | ; Get useful variables |
---|
128 | $iWndX = DllStructGetData($tRect, "Left") |
---|
129 | $iWndY = DllStructGetData($tRect, "Top") |
---|
130 | $iWndW = DllStructGetData($tRect, "Right") |
---|
131 | $iWndH = DllStructGetData($tRect, "Bottom") |
---|
132 | |
---|
133 | ; Assign automatic values: the right and bottom are computed as |
---|
134 | ; the width and height of the absolute coordinates of the window. |
---|
135 | If $iRight = -1 Then $iRight = $iWndW - $iWndX |
---|
136 | If $iBottom = -1 Then $iBottom = $iWndH - $iWndY |
---|
137 | |
---|
138 | ; Check user values: check that caller is not putting the top-left |
---|
139 | ; corner out of the window. |
---|
140 | If $iLeft > $iWndW Then $iLeft = $iWndX |
---|
141 | If $iTop > $iWndH Then $iTop = $iWndY |
---|
142 | |
---|
143 | ; Check user values: check that caller is not asking for a |
---|
144 | ; screenshot bigger than the window itelf. |
---|
145 | If $iRight > $iWndW Then $iRight = $iWndW |
---|
146 | If $iBottom > $iWndH Then $iBottom = $iWndH |
---|
147 | |
---|
148 | ; Compute the size of the final picture. |
---|
149 | $iPicWidth = $iRight - $iLeft |
---|
150 | $iPicHeight = $iBottom - $iTop |
---|
151 | |
---|
152 | ; Compute the borders sizes |
---|
153 | $tClient = _WinAPI_GetClientRect($hWnd) |
---|
154 | $iBorderV = (($iWndW - $iWndX) - DllStructGetData($tClient, "Right")) / 2 |
---|
155 | $iBorderT = ($iWndH - $iWndY) - DllStructGetData($tClient, "Bottom") - $iBorderV |
---|
156 | |
---|
157 | ; Transfert color data |
---|
158 | $hDDC = _WinAPI_GetDC($hWnd) |
---|
159 | $hCDC = _WinAPI_CreateCompatibleDC($hDDC) |
---|
160 | $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iPicWidth, $iPicHeight) |
---|
161 | _WinAPI_SelectObject($hCDC, $hBMP) |
---|
162 | _WinAPI_BitBlt($hCDC, 0, 0, $iPicWidth, $iPicHeight, $hDDC, $iLeft - $iBorderV, $iTop - $iBorderT, $iBitBltFlag) |
---|
163 | |
---|
164 | ; Add the cursor on the screenshot |
---|
165 | If $fCursor Then |
---|
166 | $aCursor = _WinAPI_GetCursorInfo() |
---|
167 | If $aCursor[1] Then |
---|
168 | $hIcon = _WinAPI_CopyIcon($aCursor[2]) |
---|
169 | $aIcon = _WinAPI_GetIconInfo($hIcon) |
---|
170 | $iPicCursorX = $aCursor[3] - $aIcon[2] - $iWndX - $iLeft |
---|
171 | $iPicCursorY = $aCursor[4] - $aIcon[3] - $iWndY - $iTop |
---|
172 | _WinAPI_DrawIcon($hCDC, $iPicCursorX, $iPicCursorY, $hIcon) |
---|
173 | EndIf |
---|
174 | EndIf |
---|
175 | |
---|
176 | ; Clean and save data |
---|
177 | _WinAPI_ReleaseDC($hWnd, $hDDC) |
---|
178 | _WinAPI_DeleteDC($hCDC) |
---|
179 | If $sFileName = "" Then Return $hBMP |
---|
180 | _ScreenCapture_SaveImage($sFileName, $hBMP) |
---|
181 | |
---|
182 | EndFunc ;==>_ScreenCapture_CaptureWndV2 |
---|