| 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 |
|---|