Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 06/15/2021 in Posts

  1. Assuming that everything else is correct, the most common reason for an immediate crash, when executing in 32bit mode, is that your APIs use the cdecl calling convention. By default, AutoIt uses stdcall. So you need to add ":cdecl" to all of your return data types. example: $aResult = DllCall($hEAPIdll, "DWORD:cdecl", "EApiUPSInitDev", _         "str", "COM1", _         "ptr", DllCallbackGetPtr($hAtCallback)) Read more about it in the DllCall help file topic. You can leave the :cdecl when running in 64bit mode, it'll be ignored.
    2 points
  2. Are you using SciTE as your code editor? Have you installed the help files? Read the examples and experiment, changing a little at a time to see what happens. Plan your project before you write any actual AutoIT code, writing down what you hope to achieve in higher level pseudo-code. Example: set up your environment define all your variables open file for input read file line by line process the information loop until finished close file cleanup is high level pseudo code that can be implemented in almost any computer language. Actually spell it out, not just have it in the back of your mind. The trap of learning to code in a particular language (such as scripting in AutoIT), before you understand the concepts needed to implement your goals is one we all fall into. Playing in a sandbox and trying things is a viable alternative when starting out, as often you learn the most when things break, not when they (unexpectedly and surprisingly) run well. Learn programming concepts first, variables, loops, branching, functions, error handling, files and data storage/access, etc, that are absolutely fundamental to being able to program in any language. Later you learn to break your code into manageable chunks, add debugging, document everything, test everything, and do things like add version control and staged releases into production. My secret: Code walkthough with a twist. Grab an innocent bystander - your grandmother, your next door neighbour teenager, somebody that doesn't know programming (important), and verbally explain to them what you are trying to achieve and the methods you are trying to get there. Use your computer terms, don't simplify. Ignore their reaction - you just need them to be attentive and listen. If you (not them) don't get confused and run off as you realise you have omitted something, there is a very good chance your program will be a success. Don't use a mirror - it doesn't work! For bigger projects, do this at the pseudo code level. Later go back and do it for actual language. You will be astonished how effective this is!
    2 points
  3. Though the return value is static while you scroll horizontally, I was able to obtain the new X position during the scrolling or after the scrolling (or after a header dragging), it allowed the orange marker to be placed just above any column after an horizontal scroll. The complete code isn't ready for a new release but meanwhile, here is the basis : 0 330 200 0 330 121 ... Global $g_idEndDragDummy ... $g_idEndDragDummy = GUICtrlCreateDummy() ... Case $g_idEndDragDummy ; in main loop _MoveMarker(GUICtrlRead($g_idComboCol)) ... Case $LVN_ENDSCROLL ; in Notify handler (listview part) _MoveMarker(GUICtrlRead($g_idComboCol)) ... Case $HDN_ENDDRAG ; in Notify handler (header part) GUICtrlSendToDummy($g_idEndDragDummy) Return False ; allow changes ... ;======================================================================== Func _MoveMarker($iCol) Local Static $tPoint = DllStructCreate("int X;int Y") Local $aLisViewPos = WinGetPos($g_hListView) ; left & top will change when user moves GUI Local $aRect = _GUICtrlHeader_GetItemRect($g_hHeader, $iCol) ; ConsoleWrite($aRect[0] & " " & $aRect[2] & @crlf) DllStructSetData($tPoint, "X", $aRect[0]) DllStructSetData($tPoint, "Y", $aRect[1]) ; unused _WinAPI_ClientToScreen($g_hHeader, $tPoint) ; ConsoleWrite($tPoint.X & " " & @crlf) ControlMove($g_hGui, "", $g_idMarker, $tPoint.X - $aLisViewPos[0] + 10, 40 - 3, $aRect[2] - $aRect[0] + 1, 3) ; 10 / 40 are LV coords EndFunc ;==>_MoveMarker LarsJ says that functions shouldn't be called from windows message handlers (his great link in previous post) so I should modify the code to reflect this. As you can see, though the rectangle is static (0 - 330, i.e. the width of our new String column) before and after the scroll in both pics, we also see "200" and "121" which corresponds to $tPoint.X in the 2nd ConsoleWrite of the function _MoveMarker() Thanks to the function _WinAPI_ClientToScreen() we can calculate $tPoint.X and it's not static anymore. For the orange marker, I also needed WinGetPos($g_hListView) in case the user moves the GUI, ending in the following X position for the orange marker after an horizontal scroll, or a dragged header, or a right click on a header (which switches to a new search column) have been performed : $tPoint.X - $aLisViewPos[0] + 10 ; 10 is a LV coord Concerning your issue, during the horizontal scrolling, you could dynamically track this X position through $LVN_ENDSCROLL message as shown in the precedent basic code : it will return plenty of new X coords, for example : $g_iRows = 1 $g_iCols = 7 Computed LV height = 69 pixels 0 330 200 0 330 199 0 330 198 0 330 192 ... 0 330 126 0 330 123 0 330 122 0 330 121 >Exit code: 0 By the way, In the 2 pics above, there is a hidden Col 0 (having 0 width) which explains why it's written "1" in the Combobox, because I don't want to use LVM_GETITEMRECT anymore for column 0, it created a mess while using the mouse for vertical scrolling (in version "2t"). The advantage of having a hidden Col 0 (not draggable) brings fresh air when you drag any other header to any place, starting at 1+ header, fingers crossed ! Hope this helps and see you on next release
    2 points
  4. Oh, it has been you’re looking at V1, red arrow, there is a V2 version. The bigger issue is you are looking at the wrong language, blue arrow...
    2 points
  5. Ever needed C style nested structs, unions or easy pointer references in your DllStruct? Then this may be your solution! It also comes with some quality of life functions for better debugging, like being able to get the original string you used when creating the struct. Download: latest Example: #AutoIt3Wrapper_Change2CUI=Y #NoTrayIcon #include <WinAPIHObj.au3> #include <WinAPIError.au3> #include <WinAPISysWin.au3> #include <WinAPIProc.au3> #include <WinAPIFiles.au3> #include <String.au3> #include "DllStructEx.au3" #include "DllStructEx.debug.au3" #Region Global variables Global Const $tagCONSOLE_CURSOR_INFO = "dword dwSize;int bVisible" Global Const $tagINPUT_RECORD = _ "WORD EventType;"& _ "union {"& _ " KEY_EVENT_RECORD KeyEvent;"& _ " MOUSE_EVENT_RECORD MouseEvent;"& _ " WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;"& _ " MENU_EVENT_RECORD MenuEvent;"& _ " FOCUS_EVENT_RECORD FocusEvent;"& _ "} Event;" Global Const $EventType_FOCUS_EVENT = 0x0010, $EventType_KEY_EVENT = 0x0001, $EventType_MENU_EVENT = 0x0008, $EventType_MOUSE_EVENT = 0x0002, $EventType_WINDOW_BUFFER_SIZE_EVENT = 0x0004 Global Const $tagKEY_EVENT_RECORD = _ "BOOL bKeyDown;"& _ "WORD wRepeatCount;"& _ "WORD wVirtualKeyCode;"& _ "WORD wVirtualScanCode;"& _ "union {"& _ " WCHAR UnicodeChar;"& _ " CHAR AsciiChar;"& _ "} uChar;"& _ "DWORD dwControlKeyState;" Global Const $tagMOUSE_EVENT_RECORD = _ "COORD dwMousePosition;" & _ "DWORD dwButtonState;" & _ "DWORD dwControlKeyState;" & _ "DWORD dwEventFlags;" Global Const $tagCOORD = _ "SHORT X;"& _ "SHORT Y;" Global Const $tagWINDOW_BUFFER_SIZE_RECORD = _ "COORD dwSize;" Global Const $tagMENU_EVENT_RECORD = _ "UINT dwCommandId;" Global Const $tagFOCUS_EVENT_RECORD = _ "BOOL bSetFocus;" Global Const $tagCONSOLE_SCREEN_BUFFER_INFO = _ "COORD dwSize;"& _ "COORD dwCursorPosition;"& _ "WORD wAttributes;"& _ "SMALL_RECT srWindow;"& _ "COORD dwMaximumWindowSize;" Global Const $tagSMALL_RECT = _ "SHORT Left;"& _ "SHORT Top;"& _ "SHORT Right;"& _ "SHORT Bottom;" #EndRegion Global variables #Region Functions Func AllocConsole() Local $aRet = DllCall("kernel32.dll", "BOOL", "AllocConsole") If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func FreeConsole() Local $aRet = DllCall("kernel32.dll", "BOOL", "FreeConsole") If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func IsDebuggerPresent() Local $aRet = DllCall("kernel32.dll", "BOOL", "IsDebuggerPresent") If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func SetConsoleMode($hConsoleHandle, $dwMode) Local $aRet = DllCall("kernel32.dll", "BOOL", "SetConsoleMode", "HANDLE", $hConsoleHandle, "DWORD", $dwMode) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func SetStdHandle($nStdHandle, $hHandle) ;returns BOOL ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms686244%28v=vs.85%29.aspx Local $aRet = DllCall("kernel32.dll", "BOOL", "SetStdHandle", "DWORD", $nStdHandle, "HANDLE", $hHandle) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func CreateFile($lpFileName, $dwDesiredAccess, $dwShareMode, $lpSecurityAttributes, $dwCreationDisposition, $dwFlagsAndAttributes) Local $aResult = DllCall("kernel32.dll", "handle", "CreateFileW", "wstr", $lpFileName, "dword", $dwDesiredAccess, "dword", $dwShareMode, "struct*", $lpSecurityAttributes, "dword", $dwCreationDisposition, "dword", $dwFlagsAndAttributes, "ptr", 0) If @error Or ($aResult[0] = Ptr(-1)) Then Return SetError(@error, @extended, 0) ; $INVALID_HANDLE_VALUE Return $aResult[0] EndFunc Func GetConsoleCursorInfo($hConsole, $lpConsoleCursorInfo) Local $aRet = DllCall("kernel32.dll", "BOOL", "GetConsoleCursorInfo", "hwnd", $hConsole, "STRUCT*", $lpConsoleCursorInfo) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func SetConsoleCursorInfo($hConsole, $lpConsoleCursorInfo) Local $aRet = DllCall("kernel32.dll", "BOOL", "SetConsoleCursorInfo", "hwnd", $hConsole, "STRUCT*", $lpConsoleCursorInfo) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func SetConsoleCtrlHandler($HandlerRoutine, $Add) Local $aRet = DllCall("kernel32.dll", "BOOL", "SetConsoleCtrlHandler", "ptr", $HandlerRoutine, "BOOL", $Add) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func GetConsoleScreenBufferInfo($hConsole, $tScreenBufferInfo) $aRet = DllCall("kernel32.dll", "bool", "GetConsoleScreenBufferInfo", "hwnd", $hConsole, "STRUCT*", $tScreenBufferInfo) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func GetConsoleCursorPosition($hConsoleOutput, $dwCursorPosition, $tScreenBufferInfo) GetConsoleScreenBufferInfo($hConsoleOutput, $tScreenBufferInfo) If @error <> 0 Then Return SetError(@error, @extended, False) $dwCursorPosition = DllStructCreate($tagCOORD, DllStructGetPtr($tScreenBufferInfo, 2)) $dwCursorPosition.X = $dwCursorPosition.X $dwCursorPosition.Y = $dwCursorPosition.Y Return True EndFunc Func SetConsoleCursorPosition($hConsoleOutput, $dwCursorPosition) Local $aRet = DllCall("kernel32.dll", "BOOL", "SetConsoleCursorPosition", "HANDLE", $hConsoleOutput, "STRUCT", $dwCursorPosition) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func ReadConsoleInput($hConsoleInput, $lpBuffer, $nLength) Local $aRet = DllCall("kernel32.dll", "BOOL", "ReadConsoleInput", "HANDLE", $hConsoleInput, "STRUCT*", $lpBuffer, "DWORD", $nLength, "DWORD*", 0) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func FillConsoleOutputCharacter($hConsoleInput, $cCharacter, $nLength, $dwWriteCoord) Local $aRet = DllCall("kernel32.dll", "BOOL", "FillConsoleOutputCharacterW", "HANDLE", $hConsoleInput, "BYTE", $cCharacter, "DWORD", $nLength, "STRUCT", $dwWriteCoord, "DWORD*", 0) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func SetConsoleScreenBufferSize($hConsoleOutput, $dwSize) Local $aRet = DllCall("kernel32.dll", "BOOL", "SetConsoleScreenBufferSize", "HANDLE", $hConsoleOutput, "STRUCT", $dwSize) If @error <> 0 Then Return SetError(@error, 0, False) Return $aRet[0] <> 0 EndFunc Func _ConsoleWriteCenter($columns, $rows, $hStdOut, $sText) Local $_tCOORD = DllStructCreate($tagCOORD) Local $tCOORD = DllStructCreate($tagCOORD) ;GetConsoleCursorPosition($hStdOut, $_tCOORD, $tScreenBufferInfo) Local $s = $sText Local $l = StringLen($s) $tCOORD.X = Round($columns / 2) - Round($l / 2) $tCOORD.Y = Round($rows / 2) SetConsoleCursorPosition($hStdOut, $tCOORD) _WinAPI_WriteConsole($hStdOut, $s) SetConsoleCursorPosition($hStdOut, $_tCOORD) EndFunc Func _ConsoleHideCursor($hStdOut) Local $tConsoleCursorInfo = DllStructCreate($tagCONSOLE_CURSOR_INFO) GetConsoleCursorInfo($hStdOut, $tConsoleCursorInfo) $tConsoleCursorInfo.bVisible = 0 SetConsoleCursorInfo($hStdOut, $tConsoleCursorInfo) EndFunc #EndRegion Functions $a = AllocConsole() $aRet = DllCall("kernel32.dll", "ptr", "GetConsoleWindow") _WinAPI_ShowWindow($aRet[0], @SW_SHOWNORMAL) $hConOut = CreateFile("CONOUT$", BitOR($GENERIC_READ, $GENERIC_WRITE), BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE), Null, $OPEN_EXISTING, $FILE_ATTRIBUTE_NORMAL) $hConIn = CreateFile("CONIN$", BitOR($GENERIC_READ, $GENERIC_WRITE), BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE), Null, $OPEN_EXISTING, $FILE_ATTRIBUTE_NORMAL) Global Const $STD_INPUT_HANDLE = -10 Global Const $STD_OUTPUT_HANDLE = -11 Global Const $STD_ERROR_HANDLE = -12 SetStdHandle($STD_OUTPUT_HANDLE, $hConOut) SetStdHandle($STD_INPUT_HANDLE, $hConIn) $hStdIn = _WinAPI_GetStdHandle(0) $hStdOut = _WinAPI_GetStdHandle(1) _ConsoleHideCursor($hStdOut) Global Const $ENABLE_EXTENDED_FLAGS = 0x0080 ;FIXME: store the original mode and restore on exit, to avoid parent console being affected. SetConsoleMode($hStdIn, $ENABLE_EXTENDED_FLAGS) Global $iRun = 1 Global Const $CTRL_C_EVENT = 0 Global Const $CTRL_BREAK_EVENT = 1 Global Const $CTRL_CLOSE_EVENT = 2 Global Const $CTRL_LOGOFF_EVENT = 5 Global Const $CTRL_SHUTDOWN_EVENT = 6 Func HandlerRoutine($dwCtrlType) ;ConsoleWrite("HandlerRoutine"&@CRLF) $iRun = 0 ;https://stackoverflow.com/a/48190051 DllCall("kernel32.dll", "NONE", "ExitThread", "DWORD", 0) Return True EndFunc $hHandlerRoutine = DllCallbackRegister(HandlerRoutine, "BOOL", "DWORD") $pHandlerRoutine = DllCallbackGetPtr($hHandlerRoutine) SetConsoleCtrlHandler($pHandlerRoutine, 1) Global $tCOORD = DllStructCreate($tagCOORD) GLobal $oScreenBufferInfo = DllStructExCreate($tagCONSOLE_SCREEN_BUFFER_INFO) Global Const $tScreenBufferInfo = DllStructExGetStruct($oScreenBufferInfo) Global Const $tSrWindow = DllStructExGetStruct($oScreenBufferInfo.srWindow) GetConsoleScreenBufferInfo($hStdOut, $tScreenBufferInfo) Global $columns = $tSrWindow.Right - $tSrWindow.Left + 1 Global $rows = $tSrWindow.Bottom - $tSrWindow.Top + 1 ;ConsoleWrite(StringFormat("columns: %d\n", $columns)) ;ConsoleWrite(StringFormat("rows: %d\n", $rows)) ;ConsoleWrite(StringFormat("%s x %s\n", $oScreenBufferInfo.dwSize.X, $oScreenBufferInfo.dwSize.y)) Global $tScreenBufferSize = DllStructCreate($tagCOORD) $tScreenBufferSize.X = $columns $tScreenBufferSize.Y = $rows SetConsoleScreenBufferSize($hStdOut, $tScreenBufferSize) _ConsoleWriteCenter($columns, $rows, $hStdOut, StringFormat("%s x %s", $columns, $rows)) $tCOORD.X = 0 $tCOORD.Y = 0 Global Const $FOCUS_EVENT = 0x0010 Global Const $KEY_EVENT = 0x0001 Global Const $MENU_EVENT = 0x0008 Global Const $MOUSE_EVENT = 0x0002 Global Const $WINDOW_BUFFER_SIZE_EVENT = 0x0004 $oINPUT_RECORD = DllStructExCreate($tagINPUT_RECORD) $tINPUT_RECORD = DllStructExGetStruct($oINPUT_RECORD) $tEvent = DllStructExGetStruct($oINPUT_RECORD.Event) $tFocusEvent = DllStructExGetStruct($oINPUT_RECORD.Event.FocusEvent) $tKeyEvent = DllStructExGetStruct($oINPUT_RECORD.Event.KeyEvent) ConsoleWrite(StringFormat("$tFocusEvent: %s\n", DllStructGetPtr($tFocusEvent))) ConsoleWrite(StringFormat("$tKeyEvent: %s\n", DllStructGetPtr($tKeyEvent))) DllStructExDisplay($oINPUT_RECORD) While $iRun Sleep(10) If DllCall("kernel32.dll", "BOOL", "GetNumberOfConsoleInputEvents", "handle", $hStdIn, "DWORD*", 0)[2] > 0 Then SetConsoleCursorPosition($hStdOut, $tCOORD) _WinAPI_WriteConsole($hStdOut, _StringRepeat(" ", $columns)) $tCOORD.Y = 1 SetConsoleCursorPosition($hStdOut, $tCOORD) _WinAPI_WriteConsole($hStdOut, _StringRepeat(" ", $columns)) $tCOORD.Y = 0 SetConsoleCursorPosition($hStdOut, $tCOORD) ReadConsoleInput($hStdIn, $tINPUT_RECORD, 1) ;_WinAPI_WriteConsole($hStdOut, DllStructGetData($tINPUT_RECORD, 1)) Switch ($oINPUT_RECORD.EventType) Case $EventType_FOCUS_EVENT _WinAPI_WriteConsole($hStdOut, "FOCUS_EVENT") $tCOORD.Y = 1 SetConsoleCursorPosition($hStdOut, $tCOORD) ;_WinAPI_WriteConsole($hStdOut, StringFormat("bSetFocus: %s", $oINPUT_RECORD.Event.FocusEvent.bSetFocus)) _WinAPI_WriteConsole($hStdOut, StringFormat("bSetFocus: %s", $tFocusEvent.bSetFocus)) Case $EventType_KEY_EVENT _WinAPI_WriteConsole($hStdOut, "KEY_EVENT") $tCOORD.Y = 1 SetConsoleCursorPosition($hStdOut, $tCOORD) $oEvent = $oINPUT_RECORD.Event $oKeyEvent = $oEvent.KeyEvent $ouChar = $oKeyEvent.uChar _WinAPI_WriteConsole($hStdOut, StringFormat("uChar: %s", $oINPUT_RECORD.Event.KeyEvent.uChar.AsciiChar)) Case $EventType_MENU_EVENT _WinAPI_WriteConsole($hStdOut, "MENU_EVENT") $tCOORD.Y = 1 SetConsoleCursorPosition($hStdOut, $tCOORD) _WinAPI_WriteConsole($hStdOut, StringFormat("dwCommandId: %s", $oINPUT_RECORD.Event.MenuEvent.dwCommandId)) Case $EventType_MOUSE_EVENT ;ConsoleWrite("MOUSE_EVENT"&@CRLF) _WinAPI_WriteConsole($hStdOut, "MOUSE_EVENT") Case $EventType_WINDOW_BUFFER_SIZE_EVENT _ConsoleHideCursor($hStdOut) $tCOORD.X = 0 $tCOORD.Y = 0 GetConsoleScreenBufferInfo($hStdOut, $tScreenBufferInfo) $columns = $tSrWindow.Right - $tSrWindow.Left + 1 $rows = $tSrWindow.Bottom - $tSrWindow.Top + 1 $tScreenBufferSize.X = $columns $tScreenBufferSize.Y = $rows SetConsoleScreenBufferSize($hStdOut, $tScreenBufferSize) FillConsoleOutputCharacter($hStdOut, " ", $columns * $rows, $tCOORD) SetConsoleCursorPosition($hStdOut, $tCOORD) _WinAPI_WriteConsole($hStdOut, "WINDOW_BUFFER_SIZE_EVENT") $tCOORD.Y = 1 SetConsoleCursorPosition($hStdOut, $tCOORD) _WinAPI_WriteConsole($hStdOut, StringFormat("SIZE: %sx%s", $oINPUT_RECORD.Event.WindowBufferSizeEvent.dwSize.X, $oINPUT_RECORD.Event.WindowBufferSizeEvent.dwSize.Y)) _ConsoleWriteCenter($columns, $rows, $hStdOut, StringFormat("%s x %s", $columns, $rows)) Case Else _WinAPI_WriteConsole($hStdOut, "*UNKNOWN*") EndSwitch EndIf WEnd Exit For debugging, DllStructEx.debug.au3 can be used, and feedback for missing debug features is welcome
    1 point
  6. Jon

    AutoIt v3.3.15.4 Beta

    AutoIt v3.3.15.4 Beta View File AutoIt: - Changed: PCRE regular expression engine updated to 8.44. - Added: doc pages about ControlID/Handle and String/Encoding. - Added #2375: SetError(), SetExtended() doc precision. - Added #3780: WinSetTitle() on notepad.exe is reverted when the windows get focus starting Windows 19H1 !!! - Added #3222: Doc precision for statement with 2 FileInstall(). - Added: ConsoleWrite() preserves the @error and @extended. - Added: ConsoleWriteError() preserves the @error and @extended. - Added #2938: Add "GetCount" to ControlCommand() - Added #3539: FileGetTime() UTC. - Added #3808: ProgressOn()/ProgressSet() - size of the progress window - Fixed: Missing Opt("SetExitCode", 1) and AutoIt3 Exit codes in doc. - Fixed #3211: Doc precision for hwnd parameter in Pixel*() functions. - Fixed #3774: Doc precision about Null keyword comparison. - Fixed #3579: DllStructGetData() doc precision. - Fixed #3823: Language Reference - Variables typo. - Fixed #3021: bad obj calling. - Fixed #3106: StringIsFloat() doesn't accept a valid FP exponent. - Fixed #3135: StdioClose memory leak. - Fixed #3165: Call UBound Array[0] AutoIt Crash. - Fixed #3167: Com error handler not called. - Fixed #3179: Number() failure with lower case hex. - Fixed #3182: MouseMove() on multiple screens. - Fixed #3232: Issue when parsing scientific notation literals. - Fixed #3659: InetClose() always false. - Fixed #3682: GuiCtrlCreatePic() with h=0 and w=0. - Fixed #3701: Crash with array 2^24. - Fixed #3710: @OSVersion for Server 2019. - Fixed #3743: [LAST] and WinWaitClose(), WinExists(), WinGetHandle(), etc. - Fixed #3772: int64 = -9223372036854775808 not handled properly. - Fixed #3778: ToolTip() position. - Fixed #3789: FileRead() on big ANSI file (1Gb). - Fixed #3790: UCS2 compare empty string. - Fixed #3807: GUISetIcon() in taskbar. - Fixed #3809: WinGetTitle() on windows created with _WinAPI_CreateWindowEx(). - Fixed #3817: Double to Int64 conversion. AutoItX: - Fixed: run*() showflag default SW_SHOWNORMAL. Aut2Exe: - Fixed #2383: Aut2exe GUI dropped files. - Added #3684: Aut2exe title with version. Au3Check: - Fixed #3785: Crash if too many includes. Au3info: - Added #3938: DPI scaling Support. UDFs: - Changed: Updated used Excel constant enumerations in ExcelConstants.au3 to Excel 2016. - Added #3514: _GUICtrlTreeView_GetLastItem() (Thanks Crazzy). - Added #3611: _GUICtrlListView_SetBkHBITMAP() (Thanks Alofa). - Added #3695: _SQLite_Display2DResult() 2 additional parameters $sDelim_Col and $sDelim_Row. - Added #3675: WinNET.au3 $tagNETRESOURCE: Add constants. - Added #3740: _ChooseColor() support Custom colors (Thanks argumentum). - Added #3547: _FormatAutoItExitCode() and _FormatAutoItExitMethod(). - Added #3696: _ArrayFromString(). - Added #3771: ColorConstants.au3 now include all W3C extended colors. THIS IS A small SCRIPT BREAKING CHANGE - Added #3739: _Array2DCreate(). - Added #3550: _Date_Time_SystemTimeToDateTimeStr() support 2 new formats to return GMT or ISO8601 format. - Added: _WinAPI_CreateProcess() example. - Added #3804: _GUICtrlMenu_CreateMenu() example to demonstrate menuclick non blocking. - Added #3806: _GDIPlus_GraphicsDrawString() with AlphaColor font. - Added #3811: _SQLite_Startup() new parameter to allow return AutoIt Type variables by _SQLite_FetchData(). - Added: _GUICtrlListView_GetSelectedIndices() optimisation (Thanks pixelsearch). - Added: _WinAPI_GetProcessName() and _WinAPI_GetParentProcessName() doc example (Thanks argumentum). - Added #3813: _MemGlobalRealloc(). - Added #3816: _WinAPI_ReadDirectoryChanges() example with magic number. - Fixed #3819: _FileCountLines() can use file handle. - Added: SpeedUp display and sorting of ArrayDisplay() and _DebugArrayDisplay() (Thanks LarsJ). - Fixed #3647: _GDIPlus_ImageResize() ghost border. - Fixed #3650: _GDIPlus_ImageResize() off by one. - Fixed #3633: _GUICtrlRichEdit_GotoCharPos() does not detect end of text. - Fixed #3765: _FileWriteLog() using Handle Cannot insert atvthe beginning, just set @extended. - Fixed #3776: __EventLog_DecodeDesc(). - Fixed: _GUICtrlListView_SetItemChecked() regression and more GUIListview.au3 functions. - Fixed: _WinAPI_CreateEvent() return error on already define $sName. - Fixed: use "wstr" for "ptr" with Null value. - Fixed #3791: _ArrayDisplay() sort arrow. - Fixed #3805: $tagRID_DEVICE_INFO_KEYBOARD definition. - Fixed #3810: _ArrayUnique not handling "Default" for Parameter $iIntType. - Fixed: _WinAPI_DragQueryFileEx() $iflag behavior when mix drag (Thanks pixelsearch). - Fixed #3812: _DateTimeSplit() returning @error. - Fixed #3814: $PAGE_ connstants for _WinAPI_CreateFileMapping(). - Fixed #3821: _WinAPI_OemToChar() with string greater than 65536 crash. - Fixed: _Now(), _NowCalc(), ... date time coherency when call just on hour change. (Thanks argumentum). - Fixed #3824: _GUICtrlRichEdit_StreamToFile(), _GUICtrlRichEdit_StreamFromFile() default encoding doc. - Fixed #3825: beta regression for $tagEDITSTREAM in x64. Submitter Jon Submitted 06/12/2021 Category Beta  
    1 point
  7. Grasshopper, were were all naive once. Fresh eyed, seeing the world with awe and wonder. Life would have been a lot easier with a gentle hand holding, and a little less spoon feeding. Someone to light the way with a flickering candle. Stand on the shoulders of giants. Ask lots of pertinent questions with an open mind. Pay it forward. Be generous. Try and surprise a complete stranger with an unselfish act of kindness, at least once daily - it will be good for your soul.
    1 point
  8. Nine

    Tidy is not reading Tidy.ini

    This is happening when you go AFK too long...Thanks.
    1 point
  9. I believe that's happening because formatting is saved to the text, not the control. When using _GUICtrlRichEdit_StreamFromFile, _GUICtrlRichEdit_StreamFromVar or _GUICtrlRichEdit_SetText you're replacing the text which removes the format. For _GUICtrlRichEdit_StreamFromFile and _GUICtrlRichEdit_StreamFromVar: There's probably a better solution that I don't know of, but for now: Edit: Maybe setting the selection like you do before _GUICtrlRichEdit_ReplaceText and then using _GUICtrlRichEdit_StreamFromFile would keep the format?
    1 point
  10. Hello, Maybe This. include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <GUIListBox.au3> #include <WindowsConstants.au3> #include <MsgBoxConstants.au3> #include <GuiListView.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 590, 399, 589, 289) $Button1 = GUICtrlCreateButton("Button1", 64, 272, 187, 25) $Button2 = GUICtrlCreateButton("Button2", 320, 272, 195, 25) $List1 = GUICtrlCreateListView("First ", 64, 56, 185, 175) $List2 = GUICtrlCreateListView("Second", 312, 64, 185, 175) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### Local $idItem1 = GUICtrlCreateListViewItem("item1", $List1) Local $idItem2 = GUICtrlCreateListViewItem("item2", $List1) Local $idItem3 = GUICtrlCreateListViewItem("item3", $List1) Local $idItem4 = GUICtrlCreateListViewItem("item4", $List1) Local $idItem5 = GUICtrlCreateListViewItem("item5", $List1) Local $idItem21 = GUICtrlCreateListViewItem("item1", $List2) Local $idItem22 = GUICtrlCreateListViewItem("item2", $List2) Local $idItem23 = GUICtrlCreateListViewItem("item3", $List2) Local $idItem24 = GUICtrlCreateListViewItem("item4", $List2) Local $idItem25 = GUICtrlCreateListViewItem("item5", $List2) GUICtrlSetState($Button1, $GUI_DISABLE) GUICtrlSetState($Button2, $GUI_DISABLE) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $GUI_EVENT_PRIMARYDOWN Local $aInfo = GUIGetCursorInfo() If $aInfo[4] = $List1 Then ConsoleWrite("1" & @CRLF) GUICtrlSetState($Button1, $GUI_ENABLE) GUICtrlSetState($Button2, $GUI_DISABLE) EndIf If $aInfo[4] = $List2 Then ConsoleWrite("2" & @CRLF) GUICtrlSetState($Button1, $GUI_DISABLE) GUICtrlSetState($Button2, $GUI_ENABLE) EndIf EndSwitch WEnd Saludos
    1 point
  11. @dmob Hope this helps you out a little bit: NMHDR; dd (go to the solution). Cheers
    1 point
  12. It's so simple. Just hover your mouse over a variable and type ALT-D. A debug statement will be added to your code automatically. Where there is no variable eg @error, just type @error on the following line, hover and type ALT-D. Then delete @error. If you want to know the runtime value of a variable or macro, eg $somestring or @HOUR , that is not nearby, type the variable name or macro on a blank line, hover over it and type ALT-D. Then delete the line containing $somestring or the macro that you just typed.
    1 point
  13. Releasing version 1.0.6 today, here's what's changed Added Implemented Diagnostics (Problems tab and red squiggles) for AutoIt scripts Completions and Hovers for InetConstants Changed Switched from Parcel to Webpack for bundling Reworked the wordPattern Optimized HoverProvider Rate and View on VS Code Marketplace Star & Submit Issues on Github
    1 point
  14. Well at least now we’re talking about your code, instead of registry settings, plugins and mortality
    1 point
  15. moldevort

    AES 256 Autoit vs PHP?

    Thank you so much for this file. After having searched some while this is the only piece of code I could find working for php and autoit. However, I had to update some functions now being deprecated in recent versions, adapt the code to my needs, add support for Javascript as well as hmac for security reasons (e.g. AES-256 in cbc mode is quite vulnerable for certain type of attacks without hmac). In case someone is interested, I attached the files for PHP, AutoIt and JS. I added a function to CryptPhp class creating values for $keys (one key for encryption and one for creating the hmac). These values need to be the same in CryptPhp.au3, cryptphp.au3 and cryptphp.js in case you'd like to exchange data between those. test.au3 #include <CryptPhp.au3> $key1 = _CryptPhp_CreateKey() $key2 = _CryptPhp_CreateKey() ConsoleWrite( _ 'key1: ' & $key1 & @CRLF & _ 'key2: ' & $key2 & @CRLF & @CRLF) $data = '123' $encrypted = _CryptPhp_Encrypt($data) $decrypted = _CryptPhp_Decrypt($encrypted) ConsoleWrite( _ $encrypted & @CRLF & _ $decrypted & @CRLF) CryptoNG.au3 https://www.autoitscript.com/forum/topic/201002-cryptong-udf-cryptography-api-next-gen/#comments CryptPhp.au3 #include <CryptoNG.au3> Local const $keys = [ _ 'oeHHADBHRY2fDFfvA6AwHL8QneBVUzdu45REGmgxPQw=', _ 'HIZ7+30WFI3T2TWAipYbEIo7g7iDPYxiGQaUtEzNvvI=' _ ] Func _CryptPhp_CreateKey() Local $keyBinary = _CryptoNG_GenerateRandom($CNG_BCRYPT_RNG_ALGORITHM, 32) return _CryptoNG_CryptBinaryToString($keyBinary, BitOr($CNG_CRYPT_STRING_BASE64, $CNG_CRYPT_STRING_NOCRLF)) EndFunc Func _CryptPhp_Encrypt($data, $urlSafe = true) Local $iv = _CryptoNG_GenerateRandom($CNG_BCRYPT_RNG_ALGORITHM, 16) Local $encryptionKey = _CryptoNG_CryptStringToBinary($keys[0], $CNG_CRYPT_STRING_BASE64) Local $encrypted = _CryptoNG_AES_CBC_EncryptData($data, $encryptionKey, $iv) Local $hmacKey = _CryptoNG_CryptStringToBinary($keys[1], $CNG_CRYPT_STRING_BASE64) Local $hmac = _CryptoNG_HashData($CNG_BCRYPT_SHA256_ALGORITHM, $iv & $encrypted, True, $hmacKey) Local $encoded = _CryptoNG_CryptBinaryToString($iv & $encrypted & $hmac, BitOr($CNG_CRYPT_STRING_BASE64, $CNG_CRYPT_STRING_NOCRLF)) return ($urlSafe) _ ? TurnUrlSafe($encoded) _ : $encoded EndFunc Func _CryptPhp_Decrypt($data) $data = TurnUrlSafe($data, false) Local $raw = _CryptoNG_CryptStringToBinary($data, $CNG_CRYPT_STRING_BASE64) Local $iv = BinaryMid($raw, 1, 16) Local $encrypted = BinaryMid($raw, 16 + 1, BinaryLen($raw) - (16 + 32)) Local $hmacIs = BinaryMid($raw, 16 + BinaryLen($encrypted) + 1) Local $hmacKey = _CryptoNG_CryptStringToBinary($keys[1], $CNG_CRYPT_STRING_BASE64) Local $hmacShould = _CryptoNG_HashData($CNG_BCRYPT_SHA256_ALGORITHM, $iv & $encrypted, True, $hmacKey) Local $hashMatch = CTstrcmp($hmacShould, $hmacIs) == 0 if not $hashMatch then _ return false Local $encryptionKey = _CryptoNG_CryptStringToBinary($keys[0], $CNG_CRYPT_STRING_BASE64) return _CryptoNG_AES_CBC_DecryptData($encrypted, $encryptionKey, $iv) EndFunc func ord($str) return Asc(StringLeft($str, 1)) EndFunc ;source: https://www.php.net/manual/en/function.hash-equals.php#125034 func CTstrcmp($should, $is) Local $shouldLength = StringLen($should) Local $isLength = StringLen($is) Local $deltaLength = $shouldLength - $isLength Local $shouldPos = 0 for $isPos = 0 to $isLength - 1 Local $isChar = StringMid($is, $isPos + 1, 1) Local $shouldChar = StringMid($should, $shouldPos + 1, 1) $deltaLength = BitXOR(BitOR($deltaLength, ord($isChar)), ord($shouldChar)) $shouldPos = Mod($shouldPos + 1, $shouldLength) Next return $deltaLength EndFunc Func TurnUrlSafe($data, $toSafe = true) return ($toSafe) _ ? StringReplace( _ StringReplace( _ StringReplace($data, _ '+', '-'), _ '/', '_'), _ '=', '') _ : StringReplace( _ StringReplace($data, _ '-', '+'), _ '_', '/') EndFunc test.php <?php include_once 'cryptphp.php'; $key1 = CryptPhp::create_key(); $key2 = CryptPhp::create_key(); echo 'key1: '.$key1.'<br>'. 'key2: '.$key2.'<br><br>'; $data = '123'; $encrypted = CryptPhp::encrypt($data); $decrypted = CryptPhp::decrypt($encrypted); echo $encrypted.'<br>'. $decrypted.'<br><br>'; ?> <html> <script src="crypto-js.min.js"></script> <script src="cryptphp.js"></script> <script> let key1 = CryptPhp.createKey(); let key2 = CryptPhp.createKey(); document.write( 'key1: '+key1+'<br>'+ 'key2: '+key2+'<br><br>'); let data = '123'; let encrypted = CryptPhp.encrypt(data); let decrypted = CryptPhp.decrypt(encrypted); document.write( encrypted+'<br>'+ decrypted); </script> </html> cryptphp.php <?php class CryptPhp { private static $cipherAlgorithm = 'aes-256-cbc'; private static $hashAlgorithm = 'sha256'; private static $ivNumBytes = 16; private static $hashNumBytes = 32; private static $keys = [ 'oeHHADBHRY2fDFfvA6AwHL8QneBVUzdu45REGmgxPQw=', 'HIZ7+30WFI3T2TWAipYbEIo7g7iDPYxiGQaUtEzNvvI=' ]; public static function create_key() { return base64_encode(random_bytes(self::$hashNumBytes)); } public static function encrypt($data, $urlSafe = true) { $iv = random_bytes(self::$ivNumBytes); $encryptionKey = base64_decode(self::$keys[0]); $encrypted = openssl_encrypt($data, self::$cipherAlgorithm, $encryptionKey, OPENSSL_RAW_DATA, $iv); $hmacKey = base64_decode(self::$keys[1]); $hmac = hash_hmac(self::$hashAlgorithm, $iv . $encrypted, $hmacKey, true); $result = $iv.$encrypted.$hmac; return ($urlSafe) ? base64url_encode($result) : base64_encode($result); } //source: https://www.php.net/manual/en/function.hash-equals.php#125034 private static function CTstrcmp($should, $is) { $shouldLength = strlen($should); $isLength = strlen($is); $deltaLength = $shouldLength - $isLength; $shouldPos = 0; for ($isPos = 0; $isPos < $isLength; $isPos++) { $deltaLength |= ord($is[$isPos]) ^ ord($should[$shouldPos]); $shouldPos = ($shouldPos + 1) % $shouldLength; } return $deltaLength; } public static function decrypt($data) { $raw = base64url_decode($data); $iv = substr($raw, 0, self::$ivNumBytes); $encrypted = substr($raw, self::$ivNumBytes, strlen($raw) - (self::$ivNumBytes + self::$hashNumBytes)); $hmacIs = substr($raw, -self::$hashNumBytes); $hmacKey = base64_decode(self::$keys[1]); $hmacShould = hash_hmac(self::$hashAlgorithm, $iv.$encrypted, $hmacKey, true); $hashMatch = self::CTstrcmp($hmacShould, $hmacIs) === 0; if(!$hashMatch) return false; $encryptionKey = base64_decode(self::$keys[0]); return openssl_decrypt($encrypted, self::$cipherAlgorithm, $encryptionKey, OPENSSL_RAW_DATA, $iv); } } function base64url_decode($data) { return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); } function base64url_encode($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } ?> cryptphp.js class CryptPhp { static cipherAlgorithm = 'aes-256-cbc'; static hashAlgorithm = 'sha256'; static iv_num_bytes = 16; static hash_num_bytes = 32; static keys = [ 'oeHHADBHRY2fDFfvA6AwHL8QneBVUzdu45REGmgxPQw=', 'HIZ7+30WFI3T2TWAipYbEIo7g7iDPYxiGQaUtEzNvvI=' ]; static createKey() { let keyBytes = crypto.getRandomValues(new Uint8Array(this.hash_num_bytes)); let key = CryptoJS.enc.Hex.parse(this.toHexString(keyBytes)); return CryptoJS.enc.Base64.stringify(key); } static encrypt(data, urlSafe = true) { let ivBytes = crypto.getRandomValues(new Uint8Array(this.iv_num_bytes)); let iv = CryptoJS.enc.Hex.parse(this.toHexString(ivBytes)); let encryptionKey = CryptoJS.enc.Base64.parse(this.keys[0]); let encrypted = CryptoJS.AES.encrypt(data, encryptionKey, { 'mode': CryptoJS.mode.CBC, iv: iv }); let hmacContent = CryptoJS.enc.Hex.parse(iv + encrypted.ciphertext); let hmacKey = CryptoJS.enc.Base64.parse(this.keys[1]); let hmac = CryptoJS.HmacSHA256(hmacContent, hmacKey); let output = CryptoJS.enc.Hex.parse(iv + encrypted.ciphertext + hmac); let result = CryptoJS.enc.Base64.stringify(output); return (urlSafe) ? this.turnUrlSafe(result) : result; } static decrypt(data) { data = this.turnUrlSafe(String(data), false); let raw = CryptoJS.enc.Base64.parse(data).toString(); let iv = raw.substr(0, this.iv_num_bytes*2); let encrypted = raw.substr(this.hash_num_bytes, raw.length - 2*(this.iv_num_bytes + this.hash_num_bytes)); let hmacIs = raw.substr(-this.hash_num_bytes*2); let hmacKey = CryptoJS.enc.Base64.parse(this.keys[1]); let hmacContent = CryptoJS.enc.Hex.parse(iv + encrypted); let hmacShould = CryptoJS.HmacSHA256(hmacContent, hmacKey).toString(); let hashMatch = this.CTstrcmp(hmacShould, hmacIs) === 0; if(!hashMatch) return false; let encryptionKey = CryptoJS.enc.Base64.parse(this.keys[0]); let decrypted = CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(encrypted)), encryptionKey, { 'mode': CryptoJS.mode.CBC, iv: CryptoJS.enc.Hex.parse(iv) }); let decryptedString = decrypted.toString(CryptoJS.enc.Utf8); return decryptedString; } static turnUrlSafe(data, toSafe = true) { return (toSafe) ? data .replaceAll('+', '-') .replaceAll('/', '_') .replaceAll('=', '' ) : data .replaceAll('-', '+') .replaceAll('_', '/'); } static ord(str) { return str.charCodeAt(0); } //source: https://www.php.net/manual/en/function.hash-equals.php#125034 static CTstrcmp(should, is) { let shouldLength = should.length; let isLength = is.length; let deltaLength = should.length - is.length; let shouldPos = 0; for (let isPos = 0; isPos < isLength; isPos++) { deltaLength |= this.ord(is[isPos]) ^ this.ord(should[shouldPos]); shouldPos = (shouldPos + 1) % shouldLength; } return deltaLength; } static toHexString(byteArray) { return byteArray.reduce((output, elem) => (output + ('0' + elem.toString(16)).slice(-2)), ''); } } crypto-js.min.js https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js CryptPhp.zip
    1 point
  16. There are situation when you know something is going off from or to your computer and you have no idea what that is or who's doing that. On the other hand, sometimes you are just curious to know (I know I am) what's cooking. Scrip below is analyzing every connection that your machine have. Either TCP or UDP. It'll give you port numbers, IP addresses, names of the processes issuing connections, their PIDs, locations on HD, user names, connection statuses, and hints on protocols for used ports (so that you know roughly what that connection is or could be). Also you will be given an ability to disable desired connection. Script: ConnView.au3 edit: new script
    1 point
  17. Here another example to mark the desktop to get the marked region for capturing. This example is not perfect and not very fast (room for improvements). ;Coded by UEZ build 2020-08-07 beta ;Code cleanup up mLipok ; ;Short instruction: mark area on your desktop and press return key to capture. #include <APISysConstants.au3> #include <Array.au3> ;#include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <ScreenCapture.au3> #include <WinAPIGdi.au3> #include <WinAPISysWin.au3> #include <WindowsConstants.au3> ; enum _PROCESS_DPI_AWARENESS -> https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx Global Enum $DPI_AWARENESS_INVALID = -1, $PROCESS_DPI_UNAWARE = 0, $PROCESS_SYSTEM_DPI_AWARE, $PROCESS_PER_MONITOR_DPI_AWARE ;https://docs.microsoft.com/en-us/windows/desktop/hidpi/dpi-awareness-context Global Enum $Context_UnawareGdiScaled = -5, $Context_PerMonitorAwareV2, $Context_PerMonitorAware, $Context_SystemAware, $Context_Unaware _WinAPI_SetProcessDpiAwarenessContext($Context_PerMonitorAware) Global $__g_hGUI_MarkArea, $__g_hGUI_Bg, $__g_iLabel_TL, $__g_iLabel_TM, $__g_iLabel_TR, $__g_iLabel_LM, $__g_iLabel_RM, $__g_iLabel_BL, $__g_iLabel_BM, _ $__g_iLabel_BR, $__g_iOldCursor, $__g_iW, $__g_iH, $__g_iColor_ResizeDots = 0xFFFFFF, $__g_iBorder = 4, $__g_bSelectionDone = False Global $aRect = _GDIPlus_MarkScreenRegionAnimated() Global $hImage_Capture = _ScreenCapture_Capture(@TempDir & "\Test.png", $aRect[0], $aRect[1], $aRect[0] + $aRect[2] - 1, $aRect[1] + $aRect[3] - 1, False) ShellExecute(@TempDir & "\Test.png") ;_ArrayDisplay($aRect, "Marked area coordinates") Func _GDIPlus_MarkScreenRegionAnimated($bAnim = True) _GDIPlus_Startup() Local Const $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]") Local Const $aFullScreen = WinGetPos($hFullScreen) $__g_hGUI_Bg = GUICreate("", $aFullScreen[2], $aFullScreen[3], $aFullScreen[0], $aFullScreen[1], BitOR($WS_CLIPCHILDREN, $WS_POPUP), $WS_EX_TOPMOST) ;to avoid cursor flickering and for proper control read WinSetTrans($__g_hGUI_Bg, "", 0x01) $__g_hGUI_MarkArea = GUICreate("", 1, 1, -1, -1, $bAnim ? $WS_POPUP : BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED), $__g_hGUI_Bg) GUISetBkColor(0xABCDEF, $__g_hGUI_MarkArea) If Not $bAnim Then $__g_iColor_ResizeDots = 0xFF0000 $__g_iLabel_TL = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;top left GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_TM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;top mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_TR = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;top right GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_LM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;left mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_RM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;right mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_BL = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;bottom left GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_BM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;bottom mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_BR = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;bottom right GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) GUISetState(@SW_SHOWNA, $__g_hGUI_Bg) GUISetState(@SW_SHOW, $__g_hGUI_MarkArea) $__g_iOldCursor = MouseGetCursor() GUISetCursor(3, 1, $__g_hGUI_Bg) GUISetCursor(3, 1, $__g_hGUI_MarkArea) _WinAPI_SetLayeredWindowAttributes($__g_hGUI_MarkArea, 0xABCDEF, 0xF0) Local $aMPos, $aPrevMPos[2] = [MouseGetPos(0) + 1, MouseGetPos(1) + 1], $iID, $aCI, $iX, $iY, $aOldWinPos, $aOldMPos, $bMoved Local $aGUIStartPos, $iKey_Exit = GUICtrlCreateButton("", $aFullScreen[0] - 10, $aFullScreen[1] - 10, 1, 1), $aAccelKeys[1][2] = [["{ENTER}", $iKey_Exit]] GUISetAccelerators($aAccelKeys, $__g_hGUI_Bg) GUISetAccelerators($aAccelKeys, $__g_hGUI_MarkArea) #forceref $bMoved Do Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $iKey_Exit If $bAnim Then GUIRegisterMsg($WM_TIMER, "") DllCall("user32.dll", "bool", "KillTimer", "hwnd", $__g_hGUI_MarkArea, "uint_ptr", $iID) GUIRegisterMsg($WM_ERASEBKGND, "") EndIf _GDIPlus_Shutdown() Local $aResult = WinGetPos($__g_hGUI_MarkArea) $aResult[2] = WinGetClientSize($__g_hGUI_MarkArea)[0] $aResult[3] = WinGetClientSize($__g_hGUI_MarkArea)[1] GUIDelete($__g_hGUI_MarkArea) GUIDelete($__g_hGUI_Bg) If Not $__g_bSelectionDone Then $aResult = 0 Return $aResult EndSwitch $aMPos = MouseGetPos() If ($aMPos[0] <> $aPrevMPos[0] Or $aMPos[1] <> $aPrevMPos[1]) And (Not $__g_bSelectionDone) Then WinMove($__g_hGUI_MarkArea, "", $aMPos[0], $aMPos[1]) $aPrevMPos = $aMPos EndIf $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) If $aCI[2] And (Not $__g_bSelectionDone) Then $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) If $bAnim Then GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND") GUIRegisterMsg($WM_TIMER, "PlayBorderAnim") $iID = DllCall("User32.dll", "uint_ptr", "SetTimer", "hwnd", $__g_hGUI_MarkArea, "uint_ptr", 1, "uint", 50, "ptr", 0)[0] EndIf While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) $aMPos = MouseGetPos() $__g_iW = Abs($aMPos[0] - $aGUIStartPos[0]) + 1 $__g_iH = Abs($aMPos[1] - $aGUIStartPos[1]) + 1 If $aMPos[0] < $aGUIStartPos[0] Then $iX = $aMPos[0] Else $iX = $aGUIStartPos[0] EndIf If $aMPos[1] < $aGUIStartPos[1] Then $iY = $aMPos[1] Else $iY = $aGUIStartPos[1] EndIf WinMove($__g_hGUI_MarkArea, "", $iX, $iY, $__g_iW, $__g_iH) UpdateCtrlPos($bAnim) WEnd $__g_bSelectionDone = True GUISetCursor(3, 1, $__g_hGUI_MarkArea) ElseIf $aCI[3] And $__g_bSelectionDone Then $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) If _WinAPI_PtInRectEx(MouseGetPos(0), MouseGetPos(1), $aGUIStartPos[0], $aGUIStartPos[1], $aGUIStartPos[0] + $aGUIStartPos[2], $aGUIStartPos[1] + $aGUIStartPos[3]) Then $aMPos = MouseGetPos() $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) While $aCI[3] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aGUIStartPos[0] - ($aMPos[0] - MouseGetPos(0)), $aGUIStartPos[1] - ($aMPos[1] - MouseGetPos(1)), $__g_iW, $__g_iH) GUISetCursor(0, 1, $__g_hGUI_Bg) GUISetCursor(0, 1, $__g_hGUI_MarkArea) WEnd GUISetCursor(3, 1, $__g_hGUI_Bg) GUISetCursor(3, 1, $__g_hGUI_MarkArea) EndIf EndIf If $__g_bSelectionDone Then $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) If @error Then ContinueLoop Switch $aCI[4] Case $__g_iLabel_TL GUISetCursor(12, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", MouseGetPos(0), MouseGetPos(1), $aOldWinPos[2] + ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] + ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_BR GUISetCursor(12, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], $aOldWinPos[1], $aOldWinPos[2] - ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] - ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_TR GUISetCursor(10, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], MouseGetPos(1), $aOldWinPos[2] - ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] + ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_BL GUISetCursor(10, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", MouseGetPos(0), $aOldWinPos[1], $aOldWinPos[2] + ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] - ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_LM GUISetCursor(13, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", MouseGetPos(0), $aOldWinPos[1], $aOldWinPos[2] + ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3]) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_RM GUISetCursor(13, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], $aOldWinPos[1], $aOldWinPos[2] - ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3]) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_TM GUISetCursor(11, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], MouseGetPos(1), $aOldWinPos[2], $aOldWinPos[3] + ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_BM GUISetCursor(11, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], $aOldWinPos[1], $aOldWinPos[2], $aOldWinPos[3] - ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case Else GUISetCursor(3, 1, $__g_hGUI_MarkArea) EndSwitch EndIf Until False EndFunc ;==>_GDIPlus_MarkScreenRegionAnimated Func UpdateCtrlPos($bAnim = True) Local Const $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) If $__g_bSelectionDone And $bAnim Then GUIRegisterMsg($WM_TIMER, "") $__g_iW = $aGUIStartPos[2] $__g_iH = $aGUIStartPos[3] ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_TL, 0, 0, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_TM, ($__g_iW - $__g_iBorder) / 2, 0, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_TR, ($__g_iW - $__g_iBorder - $__g_iBorder / 2), 0, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_LM, 0, ($__g_iH - $__g_iBorder) / 2, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_RM, ($__g_iW - $__g_iBorder - $__g_iBorder / 2), ($__g_iH - $__g_iBorder) / 2, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_BL, 0, ($__g_iH - $__g_iBorder - $__g_iBorder / 2), $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_BM, ($__g_iW - $__g_iBorder) / 2, ($__g_iH - $__g_iBorder - $__g_iBorder / 2), $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_BR, ($__g_iW - $__g_iBorder - $__g_iBorder / 2), ($__g_iH - $__g_iBorder - $__g_iBorder / 2), $__g_iBorder, $__g_iBorder) If $__g_bSelectionDone And $bAnim Then GUIRegisterMsg($WM_TIMER, "PlayBorderAnim") EndFunc ;==>UpdateCtrlPos Func PlayBorderAnim() Local $aWinPos = WinGetClientSize($__g_hGUI_MarkArea), $iW = $aWinPos[0], $iH = $aWinPos[1] Local Static $fOffset = 0 Local Const $iSize = $__g_iBorder / 2 Local Const $hDC = _WinAPI_GetDC($__g_hGUI_MarkArea) Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH) Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC) Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap) Local Const $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer) Local Const $hPen = _GDIPlus_PenCreate(0xFF0178D7, $iSize), $hPen2 = _GDIPlus_PenCreate(0xFFFFFFFF, $iSize), _ $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $__g_iColor_ResizeDots), $hPen3 = _GDIPlus_PenCreate(0xFF000000) _GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLEDASHDOT) _GDIPlus_GraphicsClear($hCanvas, 0xFFABCDEF) ;for faster performance direct dll calls DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen2, "float", 1 + $iSize, "float", 1 + $iSize, "float", $iW - 2 * $iSize - 2, "float", $iH - 2 * $iSize - 2) DllCall($__g_hGDIPDll, "int", "GdipSetPenDashOffset", "handle", $hPen, "float", $fOffset) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen, "float", 1 + $iSize, "float", 1 + $iSize, "float", $iW - 2 * $iSize - 2, "float", $iH - 2 * $iSize - 2) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", 0, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", 0, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) / 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) / 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) - 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) - 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", 0, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", 0, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", 0, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", 0, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) / 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) / 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $SRCCOPY) $fOffset += 0.5 _GDIPlus_GraphicsDispose($hCanvas) _WinAPI_SelectObject($hDC_backbuffer, $DC_obj) _WinAPI_DeleteDC($hDC_backbuffer) _WinAPI_DeleteObject($hHBitmap) _WinAPI_ReleaseDC($__g_hGUI_MarkArea, $hDC) _GDIPlus_PenDispose($hPen) _GDIPlus_PenDispose($hPen2) _GDIPlus_PenDispose($hPen3) _GDIPlus_BrushDispose($hBrush) EndFunc ;==>PlayBorderAnim Func WM_ERASEBKGND($hWnd, $iMsgm, $wParam, $lParam) ;suppress repainting to avoid flickering but causes some other side effects #forceref $iMsgm, $wParam, $lParam, $hWnd Local Const $hBrush = _WinAPI_CreateSolidBrush(0xEFCDAB) ;BGR format ;~ _WinAPI_RedrawWindow($__g_hGUI_MarkArea, 0, 0, BitOR($RDW_NOERASE, $RDW_NOCHILDREN, $RDW_NOFRAME, $RDW_VALIDATE)) _WinAPI_SetClassLongEx($__g_hGUI_MarkArea, $GCL_HBRBACKGROUND, $hBrush) _WinAPI_DeleteObject($hBrush) Return 0 EndFunc ;==>WM_ERASEBKGND ;https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setprocessdpiawarenesscontext Func _WinAPI_SetProcessDpiAwarenessContext($DPIAwareContext = $Context_PerMonitorAware, $hGUI = 0, $iMode = 3) ;https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setprocessdpiawarenesscontext $DPIAwareContext = ($DPIAwareContext < -5) ? -5 : ($DPIAwareContext > -1) ? -1 : $DPIAwareContext $iMode = ($iMode < 1) ? 1 : ($iMode > 3) ? 3 : $iMode Switch $iMode Case 1 Local $hDC = _WinAPI_GetDC($hGUI) Local $aResult1 = DllCall("user32.dll", "ptr", "GetDpiFromDpiAwarenessContext", "ptr", $hDC) If @error Or Not IsArray($aResult1) Then Return SetError(11, 0, 0) _WinAPI_ReleaseDC(0, $hDC) Local $aResult = DllCall("user32.dll", "Bool", "SetProcessDpiAwarenessContext", "int", $aResult1[0] + $DPIAwareContext) If @error Or Not IsArray($aResult) Then Return SetError(12, 0, 0) Case 2 ;~ If Not $hGUI Then $hGUI = WinGetHandle(AutoItWinGetTitle()) Local $aResult2 = DllCall("user32.dll", "int", "GetWindowDpiAwarenessContext", "ptr", $hGUI) If @error Or Not IsArray($aResult2) Then Return SetError(21, 0, 0) Local $aResult = DllCall("user32.dll", "Bool", "SetProcessDpiAwarenessContext", "int", $aResult2[0] + $DPIAwareContext) If @error Or Not IsArray($aResult) Then Return SetError(22, 0, 0) Case 3 Local $aResult31 = DllCall("user32.dll", "ptr", "GetThreadDpiAwarenessContext") If @error Or Not IsArray($aResult31) Then Return SetError(31, 0, 0) Local $aResult32 = DllCall("user32.dll", "ptr", "GetAwarenessFromDpiAwarenessContext", "ptr", $aResult31[0]) If @error Or Not IsArray($aResult32) Then Return SetError(32, 0, 0) Local $aResult = DllCall("user32.dll", "Bool", "SetThreadDpiAwarenessContext", "int", $aResult32[0] + $DPIAwareContext) If @error Or Not IsArray($aResult) Then Return SetError(33, 0, 0) EndSwitch Return 1 EndFunc ;==>_WinAPI_SetProcessDpiAwarenessContext Just press the lmb and move your mouse. When lmb is released you can adjust the size of the window by dragging the white rectangle to any direction. Rmb will move the marked area. Press ESC to get the coordinates of the marked region. If you have any improvements, please post it here. Tested on Win10 x64 only.
    1 point
  18. JohnOne

    Run Script (x64)

    add to script #AutoIt3Wrapper_UseX64=y
    1 point
×
×
  • Create New...