#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
#AutoIt3Wrapper_Run_Au3Stripper=y
#AutoIt3Wrapper_UseUpx=n
#Au3Stripper_Parameters=/sf /sv /mo /rm /rsln
#include-once
#include <Clipboard.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
#Region Example
;capture manual coordinates
FileDelete(@ScriptDir & "\Captured.bmp")
Global $hHBitmap = _WinAPI_MarkScreenRegionAndCapture(0, False, True, 0, 0, 99, 99)
_WinAPI_SaveHBITMAPToFile(@ScriptDir & "\Captured.bmp", $hHBitmap)
_WinAPI_DeleteObject($hHBitmap)
If FileExists(@ScriptDir & "\Captured.bmp") Then ShellExecute(@ScriptDir & "\Captured.bmp")
;save the captured bitmap to a file
FileDelete(@ScriptDir & "\Captured.bmp")
$hHBitmap = _WinAPI_MarkScreenRegionAndCapture()
_WinAPI_SaveHBITMAPToFile(@ScriptDir & "\Captured.bmp", $hHBitmap)
_WinAPI_DeleteObject($hHBitmap)
If FileExists(@ScriptDir & "\Captured.bmp") Then ShellExecute(@ScriptDir & "\Captured.bmp")
;copy captured bitmap to clipboard
Switch _WinAPI_MarkScreenRegionAndCapture(1, True)
Case 1
MsgBox($MB_ICONINFORMATION, "Information", "Marked region was properly captured to clipboard!", 30)
Case 0
MsgBox($MB_ICONERROR, "ERROR", "An error has occured!", 30)
EndSwitch
#EndRegion
; #FUNCTION# ====================================================================================================================
; Name ..........: _WinAPI_MarkScreenRegionAndCapture
; Description ...: Selected area on desktop will be captured and save to clipbord or GDI bitmap handle will be returned.
; Syntax ........: _WinAPI_MarkScreenRegionAndCapture([$iFillMode = 0[, $bClipboard = True]])
; Parameters ....: $iFillMode - [optional] an integer value. Default is 0.
; 0: marked area filled with solid color
; 1: marked area filled with hatch pattern ($HS_DIAGCROSS)
; 2: marked area without any fill pattern / color - only red border
; $bClipboard - [optional] a boolean value. Default is False. If True then no GDI bitmap handle will be returned.
; If false then GDI bitmap handle will be returned.
; $bManual - [optional] a boolean value. Default is False. If True manual capturing is activated.
; $iX1 - [optional] an integer value. Default is 0. If $bManual is true enter the x1 screen pos.
; $iY1 - [optional] an integer value. Default is 0. If $bManual is true enter the Y1 screen pos.
; $iX2 - [optional] an integer value. Default is 0. If $bManual is true enter the x2 screen pos.
; $iY2 - [optional] an integer value. Default is 0. If $bManual is true enter the y2 screen pos.
; Return values .: 0 / 1 / -1 / GDI bitmap handle
; Author ........: UEZ
; Version .......: 0.92 build 2017-01-22
; Modified ......:
; Remarks .......: Do not forget to dispose returned GDI bitmap handle for non clipboard mode using _WinAPI_DeleteObject!
; Related .......:
; Link ..........:
; Example .......: Yes
; ===============================================================================================================================
Func _WinAPI_MarkScreenRegionAndCapture($iFillMode = 0, $bClipboard = False, $bManual = False, $iX1 = 0, $iY1 = 0, $iX2 = 0, $iY2 = 0)
If @OSBuild > 6299 Then ;https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx
DllCall("Shcore.dll", "long", "PROCESS_DPI_AWARENESS", 1) ;PROCESS_SYSTEM_DPI_AWARE = 1 (https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx)
Else
DllCall("User32.dll", "bool", "SetProcessDPIAware")
EndIf
Local $iOld = AutoItSetOption("MouseCoordMode", 1)
If Not $bManual Then
Local Const $hDesktop = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]")
Local Const $aFullScreen = WinGetPos($hDesktop) ;should work also on multi screens
Local Const $iW = $aFullScreen[2], $iH = $aFullScreen[3]
Local Const $hGUI_Screencapture = GUICreate("", $iW, $iH, $aFullScreen[0], $aFullScreen[1], $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED))
GUISetState(@SW_SHOW, $hGUI_Screencapture)
Local Const $hDC = _WinAPI_GetDC($hGUI_Screencapture)
Local Const $hGfxDC = _WinAPI_CreateCompatibleDC($hDC)
Local Const $hBitmapGDI = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
Local $hObjOld = _WinAPI_SelectObject($hGfxDC, $hBitmapGDI)
Local $tSize = DllStructCreate($tagSIZE)
$tSize.x = $iW
$tSize.y = $iH
Local $tSource = DllStructCreate($tagPOINT)
Local $tBlend = DllStructCreate($tagBLENDFUNCTION)
$tBlend.Alpha = 0xFF
$tBlend.Format = 1
Local $tDest = DllStructCreate($tagPOINT)
$tDest.x = $aFullScreen[0]
$tDest.y = $aFullScreen[1]
Local Const $hPen = _WinAPI_CreatePen($PS_SOLID, 1, 0x0000FF)
Local Const $hPen_Orig = _WinAPI_SelectObject($hGfxDC, $hPen)
Local $hBrush, $iAlpha2, $iFlag
$iFillMode = $iFillMode > 2 ? 2 : $iFillMode < 0 ? 0 : $iFillMode
Switch $iFillMode
Case 0
$hBrush = _WinAPI_CreateBrushIndirect($BS_SOLID, 0x808080)
$iAlpha2 = 0xA0
$iFlag = $ULW_ALPHA
Case 1
$hBrush = _WinAPI_CreateBrushIndirect($BS_HATCHED, 0x808000, $HS_DIAGCROSS)
$iAlpha2 = 0x30
$iFlag = $ULW_ALPHA
Case 2
$hBrush = _WinAPI_CreateBrushIndirect($BS_HOLLOW, 0x000000)
$iAlpha2 = 0xFF ;not needed
$iFlag = $ULW_COLORKEY
EndSwitch
Local $hBrush_Orig = _WinAPI_SelectObject($hGfxDC, $hBrush)
Else
If Not BitOr($iX1, $iX2, $iY1, $iY2) Then Return SetError(4, 0, 0)
EndIf
Local $aMPos[5], $aMPos_old[4], $tRECT = _WinAPI_CreateRect(0, 0, 0, 0)
Do
If $bManual Then
$aMPos[2] = 1
Else
GUISetCursor(16, 1, $hGUI_Screencapture)
$aMPos = GUIGetCursorInfo($hGUI_Screencapture)
$aMPos_old[0] = $aMPos[0]
$aMPos_old[1] = $aMPos[1]
$aMPos_old[2] = MouseGetPos(0)
$aMPos_old[3] = MouseGetPos(1)
EndIf
Switch $aMPos[2]
Case 0 ;display crosshair
_WinAPI_BitBlt($hGfxDC, 0, 0, $iW, $iH, $hGfxDC, 0, 0, $CAPTUREBLT)
_WinAPI_DrawLine($hGfxDC, $tDest.x, $aMPos[1], $iW, $aMPos[1])
_WinAPI_DrawLine($hGfxDC, $aMPos[0], $tDest.y, $aMPos[0], $iH)
_WinAPI_UpdateLayeredWindow($hGUI_Screencapture, $hDC, $tDest, $tSize, $hGfxDC, $tSource, 0, $tBlend, $ULW_COLORKEY)
Case 1 ;capture selected region
If Not $bManual Then
$tBlend.Alpha = $iAlpha2
While $aMPos[2] ;mark region
GUISetCursor(14, 1, $hGUI_Screencapture) ;WinGetHandle(AutoItWinGetTitle()))
$aMPos = GUIGetCursorInfo($hGUI_Screencapture)
_WinAPI_BitBlt($hGfxDC, 0, 0, $iW, $iH, $hGfxDC, 0, 0, $CAPTUREBLT) ;clear bitmap
;draw rectangle
$tRECT.Left = $aMPos_old[0]
$tRECT.Top = $aMPos_old[1]
$tRECT.Right = $aMPos[0]
$tRECT.Bottom = $aMPos[1]
_WinAPI_Rectangle($hGfxDC, $tRECT)
If $iFillMode <> 2 Then _WinAPI_InvertRect($hGfxDC, $tRECT)
_WinAPI_UpdateLayeredWindow($hGUI_Screencapture, $hDC, $tDest, $tSize, $hGfxDC, $tSource, 0, $tBlend, $iFlag)
Sleep(10)
WEnd
_WinAPI_SelectObject($hGfxDC, $hObjOld)
_WinAPI_ReleaseDC($hGUI_Screencapture, $hDC)
_WinAPI_DeleteDC($hGfxDC)
_WinAPI_DeleteObject($hBitmapGDI)
_WinAPI_SelectObject($hGfxDC, $hPen_Orig)
_WinAPI_DeleteObject($hPen)
_WinAPI_SelectObject($hGfxDC, $hBrush_Orig)
_WinAPI_DeleteObject($hBrush)
GUIDelete($hGUI_Screencapture)
;capture region
$aMPos[0] = MouseGetPos(0)
$aMPos[1] = MouseGetPos(1)
Else
$aMPos_old[2] = $iX1
$aMPos_old[3] = $iY1
$aMPos[0] = $iX2
$aMPos[1] = $iY2
EndIf
Local Const $hDC_Region = _WinAPI_GetDC(0)
Local Const $hMemDC = _WinAPI_CreateCompatibleDC($hDC_Region)
Local Const $iW_Region = Abs($aMPos[0] - $aMPos_old[2]) + 1, $iH_Region = Abs($aMPos[1] - $aMPos_old[3]) + 1
Local $hHBitmap_Captured = _WinAPI_CreateCompatibleBitmap($hDC_Region, $iW_Region, $iH_Region)
$hObjOld = _WinAPI_SelectObject($hMemDC, $hHBitmap_Captured)
_WinAPI_BitBlt($hMemDC, 0, 0, $iW_Region, $iH_Region, $hDC_Region, _
$aMPos[0] > $aMPos_old[2] ? $aMPos_old[2] : $aMPos[0], _
$aMPos[1] > $aMPos_old[3] ? $aMPos_old[3] : $aMPos[1], BitOR($SRCCOPY, $CAPTUREBLT))
Local $hHBitmap_Clipboard = _WinAPI_CopyImage($hHBitmap_Captured, 0, 0, 0, BitOR($LR_COPYDELETEORG, $LR_COPYRETURNORG))
_WinAPI_SelectObject($hHBitmap_Captured, $hObjOld)
_WinAPI_DeleteDC($hHBitmap_Captured)
_WinAPI_ReleaseDC(0, $hDC_Region)
AutoItSetOption("MouseCoordMode", $iOld)
If $bClipboard Then
;put captured region to clipboard
If Not _ClipBoard_Open(0) Then
_WinAPI_DeleteObject($hHBitmap_Clipboard)
Return SetError(1, 0, 0)
EndIf
If Not _ClipBoard_Empty() Then
_WinAPI_DeleteObject($hHBitmap_Clipboard)
Return SetError(2, 0, 0)
EndIf
Local Const $hCP = _ClipBoard_SetDataEx($hHBitmap_Clipboard, $CF_BITMAP)
If Not $hCP Or @error Then
_WinAPI_DeleteObject($hHBitmap_Clipboard)
Return SetError(3, 0, 0)
EndIf
_ClipBoard_Close()
_WinAPI_DeleteObject($hHBitmap_Clipboard)
Return 1
Else
Return $hHBitmap_Clipboard
EndIf
EndSwitch
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_WinAPI_SelectObject($hGfxDC, $hObjOld)
_WinAPI_ReleaseDC($hGUI_Screencapture, $hDC)
_WinAPI_DeleteDC($hGfxDC)
_WinAPI_DeleteObject($hBitmapGDI)
_WinAPI_SelectObject($hGfxDC, $hPen_Orig)
_WinAPI_DeleteObject($hPen)
GUIDelete($hGUI_Screencapture)
AutoItSetOption("MouseCoordMode", $iOld)
Return -1
EndSwitch
Until False
EndFunc ;==>_WinAPI_MarkScreenRegionAndCapture
Alles anzeigen
💡 Hinweis: Ich habe keine detaillierten Tests gemacht, abgesehen vom Start der Anwendung. Ich habe aktuelle #includes hinzugefügt und eine globale (doppelte) Variablen Deklaration entfernt, mehr nicht. Also keine wesentlichen Änderungen.
Hoffe das bringt dich zumindest etwas weiter 🤞 .