#RequireAdmin
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <ScreenCapture.au3>
#Include <Misc.au3>
#include <EditConstants.au3>
Global $iX1, $iY1, $iX2, $iY2, $aPos, $sMsg, $sBMP_Path
Global $s_ProgramTitle01 = "Select Rectangle"
Gui01()
Func Gui01()
; Create GUI
Local $hGUI = GUICreate($s_ProgramTitle01, 240, 50)
Local $hRect_Button = GUICtrlCreateButton("Mark Area", 10, 10, 80, 30)
Local $hCancel_Button = GUICtrlCreateButton("Close", 150, 10, 80, 30)
GUISetState(@SW_SHOW, $hGUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $hCancel_Button
FileDelete(@ScriptDir & "Rect.bmp")
Exit
Case $hRect_Button
;Capture selected area
GUIDelete($hGUI)
ExitLoop
EndSwitch
WEnd
Mark_Rect()
EndFunc
Func GUI02()
; Create a GUI with various controls.
Local $hGUI = GUICreate($s_ProgramTitle01, 300, 200)
Local $idButton_Close = GUICtrlCreateButton("Close", 170, 170, 85, 25)
Local $idButton_Back = GUICtrlCreateButton("Back", 75, 170, 85, 25)
; Display the GUI.
Local $idMyedit = GUICtrlCreateEdit("Left: " & $iX1 & @CRLF & "Top: " & $iY1 & @CRLF & "Right: " & _
$iX2 & @CRLF & "Bottom: " & $iY2, 15, 15, 275, 150, $ES_AUTOVSCROLL + $WS_VSCROLL)
GUISetState(@SW_SHOW, $hGUI)
; Loop until the user exits.
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $idButton_Close
FileDelete(@ScriptDir & "Rect.bmp")
GUIDelete($hGUI)
Exit
Case $idButton_Back
GUIDelete($hGUI)
ExitLoop
EndSwitch
WEnd
Gui01()
EndFunc
; -------------
Func Mark_Rect()
Local $aMouse_Pos, $hMask, $hMaster_Mask, $iTemp
Local $UserDLL = DllOpen("user32.dll")
; Create transparent GUI with Cross cursor
$hCross_GUI = GUICreate("Test", @DesktopWidth, @DesktopHeight - 20, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
WinSetTrans($hCross_GUI, "", 8)
GUISetState(@SW_SHOW, $hCross_GUI)
GUISetCursor(3, 1, $hCross_GUI)
Global $hRectangle_GUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
GUISetBkColor(0x000000)
; Wait until mouse button pressed
While Not _IsPressed("01", $UserDLL)
Sleep(10)
WEnd
; Get first mouse position
$aMouse_Pos = MouseGetPos()
$iX1 = $aMouse_Pos[0]
$iY1 = $aMouse_Pos[1]
; Draw rectangle while mouse button pressed
While _IsPressed("01", $UserDLL)
$aMouse_Pos = MouseGetPos()
$hMaster_Mask = _WinAPI_CreateRectRgn(0, 0, 0, 0)
$hMask = _WinAPI_CreateRectRgn($iX1, $aMouse_Pos[1], $aMouse_Pos[0], $aMouse_Pos[1] + 1) ; Bottom of rectangle
_WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
_WinAPI_DeleteObject($hMask)
$hMask = _WinAPI_CreateRectRgn($iX1, $iY1, $iX1 + 1, $aMouse_Pos[1]) ; Left of rectangle
_WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
_WinAPI_DeleteObject($hMask)
$hMask = _WinAPI_CreateRectRgn($iX1 + 1, $iY1 + 1, $aMouse_Pos[0], $iY1) ; Top of rectangle
_WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
_WinAPI_DeleteObject($hMask)
$hMask = _WinAPI_CreateRectRgn($aMouse_Pos[0], $iY1, $aMouse_Pos[0] + 1, $aMouse_Pos[1]) ; Right of rectangle
_WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
_WinAPI_DeleteObject($hMask)
; Set overall region
_WinAPI_SetWindowRgn($hRectangle_GUI, $hMaster_Mask)
If WinGetState($hRectangle_GUI) < 15 Then GUISetState()
Sleep(10)
WEnd
; Get second mouse position
$iX2 = $aMouse_Pos[0]
$iY2 = $aMouse_Pos[1]
; Set in correct order if required
If $iX2 < $iX1 Then
$iTemp = $iX1
$iX1 = $iX2
$iX2 = $iTemp
EndIf
If $iY2 < $iY1 Then
$iTemp = $iY1
$iY1 = $iY2
$iY2 = $iTemp
EndIf
GUIDelete( $hRectangle_GUI)
GUIDelete($hCross_GUI)
DllClose($UserDLL)
GUI02()
EndFunc ;==>Mark_Rect