1 | ; #FUNCTION# ==================================================================================================================== |
---|
2 | ; Name...........: _ScreenCapture_Capture |
---|
3 | ; Description ...: Captures a region of the screen |
---|
4 | ; Syntax.........: _ScreenCapture_Capture([$sFileName = ""[, $iLeft = 0[, $iTop = 0[, $iRight = -1[, $iBottom = -1[, $fCursor = True]]]]]]) |
---|
5 | ; Parameters ....: $sFileName - Full path and extension of the image file |
---|
6 | ; $iLeft - X coordinate of the upper left corner of the rectangle |
---|
7 | ; $iTop - Y coordinate of the upper left corner of the rectangle |
---|
8 | ; $iRight - X coordinate of the lower right corner of the rectangle. If this is -1, the current screen |
---|
9 | ; +width will be used. |
---|
10 | ; $iBottom - Y coordinate of the lower right corner of the rectangle. If this is -1, the current screen |
---|
11 | ; +height will be used. |
---|
12 | ; $fCursor - If True the cursor will be captured with the image |
---|
13 | ; Return values .: Success - HBITMAP handle or NONE (See remarks). @error set to 0 |
---|
14 | ; Failure - Returns 0 and @error set to error location. |
---|
15 | ; @error - -1, -2, 1-7 capture failure location |
---|
16 | ; Author ........: Paul Campbell (PaulIA) |
---|
17 | ; Modified.......: rover |
---|
18 | ; Remarks .......: If FileName is not blank this function will capture the screen and save it to file. If FileName is blank, this |
---|
19 | ; function will capture the screen and return a HBITMAP handle to the bitmap image. In this case, after you are |
---|
20 | ; finished with the bitmap you must call _WinAPI_DeleteObject to delete the bitmap handle. |
---|
21 | ;+ |
---|
22 | ; Requires GDI+: GDI+ requires a redistributable for applications that |
---|
23 | ; run on the Microsoft Windows NT 4.0 SP6, Windows 2000, Windows 98, and Windows Me operating systems. |
---|
24 | ; Related .......: _WinAPI_DeleteObject, _ScreenCapture_SaveImage |
---|
25 | ; Link ..........: |
---|
26 | ; Example .......: Yes |
---|
27 | ; =============================================================================================================================== |
---|
28 | Func _ScreenCapture_Capture($sFileName = "", $iLeft = 0, $iTop = 0, $iRight = -1, $iBottom = -1, $fCursor = True) |
---|
29 | Local $iH, $iW, $hWnd, $hDDC, $hCDC, $hBMP, $aCursor, $aIcon, $hIcon, $iSCError = 0 |
---|
30 | |
---|
31 | If $iRight = -1 Then $iRight = _WinAPI_GetSystemMetrics($__SCREENCAPTURECONSTANT_SM_CXSCREEN) |
---|
32 | If $iBottom = -1 Then $iBottom = _WinAPI_GetSystemMetrics($__SCREENCAPTURECONSTANT_SM_CYSCREEN) |
---|
33 | If $iRight < $iLeft Then Return SetError(-1, 0, 0) |
---|
34 | If $iBottom < $iTop Then Return SetError(-2, 0, 0) |
---|
35 | |
---|
36 | $iW = $iRight - $iLeft |
---|
37 | $iH = $iBottom - $iTop |
---|
38 | $hWnd = _WinAPI_GetDesktopWindow() |
---|
39 | If @error Then Return SetError(1, 0, 0) |
---|
40 | $hDDC = _WinAPI_GetDC($hWnd) |
---|
41 | If @error Then Return SetError(2, 0, 0) |
---|
42 | $hCDC = _WinAPI_CreateCompatibleDC($hDDC) |
---|
43 | If @error Then |
---|
44 | _WinAPI_ReleaseDC($hWnd, $hDDC) |
---|
45 | Return SetError(3, 0, 0) |
---|
46 | EndIf |
---|
47 | $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iW, $iH) |
---|
48 | If @error Or $hBMP = 0 Then |
---|
49 | _WinAPI_ReleaseDC($hWnd, $hDDC) |
---|
50 | _WinAPI_DeleteDC($hCDC) |
---|
51 | Return SetError(4, 0, 0) |
---|
52 | EndIf |
---|
53 | _WinAPI_SelectObject($hCDC, $hBMP) |
---|
54 | If @error Then |
---|
55 | _WinAPI_ReleaseDC($hWnd, $hDDC) |
---|
56 | _WinAPI_DeleteDC($hCDC) |
---|
57 | _WinAPI_DeleteObject($hBMP) |
---|
58 | Return SetError(5, 0, 0) |
---|
59 | EndIf |
---|
60 | _WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, $__SCREENCAPTURECONSTANT_SRCCOPY) |
---|
61 | If @error Then |
---|
62 | _WinAPI_ReleaseDC($hWnd, $hDDC) |
---|
63 | _WinAPI_DeleteDC($hCDC) |
---|
64 | _WinAPI_DeleteObject($hBMP) |
---|
65 | Return SetError(6, 0, 0) |
---|
66 | EndIf |
---|
67 | |
---|
68 | If $fCursor Then |
---|
69 | $aCursor = _WinAPI_GetCursorInfo() |
---|
70 | If Not @error And $aCursor[1] = True Then |
---|
71 | $hIcon = _WinAPI_CopyIcon($aCursor[2]) |
---|
72 | If Not @error And $hIcon <> 0 Then |
---|
73 | $aIcon = _WinAPI_GetIconInfo($hIcon) |
---|
74 | If Not @error And $aIcon[0] = True Then |
---|
75 | _WinAPI_DrawIcon($hCDC, $aCursor[3] - $aIcon[2] - $iLeft, $aCursor[4] - $aIcon[3] - $iTop, $hIcon) |
---|
76 | If $aIcon[4] <> 0 Then _WinAPI_DeleteObject($aIcon[4]) |
---|
77 | If $aIcon[5] <> 0 Then _WinAPI_DeleteObject($aIcon[5]) |
---|
78 | EndIf |
---|
79 | _WinAPI_DestroyIcon($hIcon) |
---|
80 | EndIf |
---|
81 | EndIf |
---|
82 | EndIf |
---|
83 | |
---|
84 | _WinAPI_ReleaseDC($hWnd, $hDDC) |
---|
85 | _WinAPI_DeleteDC($hCDC) |
---|
86 | If $sFileName = "" Then Return SetError(0, 0, $hBMP) |
---|
87 | |
---|
88 | _ScreenCapture_SaveImage($sFileName, $hBMP) |
---|
89 | If @error Then $iSCError = 7 |
---|
90 | _WinAPI_DeleteObject($hBMP) |
---|
91 | SetError($iSCError, 0) |
---|
92 | EndFunc ;==>_ScreenCapture_Capture |
---|