Hallo Zusammen,
als Erweiterung des Screenshot Tools (Codeschnipsel von UEZ habe im englischen Forum habe ich folgendes Script von UEZ gefunden.
Screenshot Tool
AutoIt
#include-once
#include <Clipboard.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
Global $iX1, $iY1, $iX2, $iY2, $aPos, $sMsg
Global $hHBitmap
;--- Create GUI ---
$hMain_GUI = GUICreate("Screenshot-Tool", 250, 50, @DeskTopWidth -285 , @DeskTopHeight -150)
$hRect_Button = GUICtrlCreateButton("Screenshot erstellen", 35, 13, 180, 25)
WinSetOnTop ( "Screenshot-Tool","", 1)
GUISetState(@SW_SHOW)
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case $GUI_EVENT_CLOSE
Exit
Case $hRect_Button
If FileExists(@ScriptDir & "\Captured.bmp") then FileDelete(@ScriptDir & "\Captured.bmp")
GUISetState(@SW_HIDE, $hMain_GUI)
$hHBitmap = _WinAPI_MarkScreenRegionAndCapture()
_WinAPI_SaveHBITMAPToFile(@ScriptDir & "\Captured.bmp", $hHBitmap)
_WinAPI_DeleteObject($hHBitmap)
;If FileExists(@ScriptDir & "\Captured.bmp") Then ShellExecute(@ScriptDir & "\Captured.bmp")
If FileExists(@ScriptDir & "\Captured.bmp") Then Run("mspaint " & @ScriptDir & "\Captured.bmp")
;If FileExists(@ScriptDir & "\Captured.bmp") Then Run("C:\Program Files\Greenshot\Greenshot.exe " & @ScriptDir & "\Captured.bmp")
GUISetState(@SW_SHOW, $hMain_GUI)
;Exit
EndSwitch
WEnd
; #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
Basic Image Editor
URL = https://www.autoitscript.com/f…ndComment&comment=1086282
Beispiel vom Basic Image Editor
Für das Screenshot Tool wäre es schön, wenn die Pfeile, Text, Rechteck und markieren funktionieren würde. Leider stürzt das Tool beim Text aktuell ab.
Gruß gmmg