Craigo Posted March 20, 2018 Share Posted March 20, 2018 Hello - I have found some odd behaviour when testing the "_MouseTrap" function. Sample code: #include <Misc.au3> _MouseTrap(300, 300, 400, 400) Sleep(10000) _MouseTrap() When this is saved to a file located on the desktop and executed with a double-click, the function behaves as I believe it should - trapping the mouse pointer within the specified bounds for the duration. When the same file is saved to a file located in a folder elsewhere (e.g. a subfolder of C: or a network location), the function misbehaves. The mouse pointer is initially relocated and trapped within the specified bounds, but the user can left-click or right-click and immediately release the mouse pointer. It seems odd that the behaviour should change depending on the location of the script. It is not a filesystem permissions problem. Environment: Windows 10 1709 Enterprise x64 AutoIt 3.3.14.2, 3.3.14.5 (default installer options) Link to comment Share on other sites More sharing options...
Craigo Posted March 21, 2018 Author Share Posted March 21, 2018 I have also subsequently tested AutoIt Beta 3.3.15.1, which exhibits the same behaviour. Link to comment Share on other sites More sharing options...
Bilgus Posted March 21, 2018 Share Posted March 21, 2018 (edited) I think This is a limitation of ClipCursor try this example click Trap, it will happen every time you click because the app loses focus Now Try Trap4Real it reactivates the window and sets _MouseTrap again and thus it can't escape Press ESC to release your mouse.. expandcollapse popup#include <Misc.au3> #include <GUIConstantsEx.au3> Global $bTrap = False Global $bTrap4Real = False Global $idTrap, $idTrap4Real HotKeySet("{ESC}", Release) Example() Func Example() ; Create a GUI with various controls. Local $hGUI = GUICreate("Example", 300, 100, 500, 100) $idTrap = GUICtrlCreateButton("Trap", 100, 50, 85, 25) $idTrap4Real = GUICtrlCreateButton("Trap4Real", 200, 50, 85, 25) ; Display the GUI. GUISetState(@SW_SHOW, $hGUI) ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idTrap If $bTrap Then _MouseTrap() $bTrap = False GUICtrlSetData($idTrap, "Trap") Else _MouseTrap(300, 100, 400, 200) $bTrap = True GUICtrlSetData($idTrap, "Release") EndIf Case $idTrap4Real If $bTrap4Real Then _MouseTrap() $bTrap4Real = False GUICtrlSetData($idTrap4Real, "Trap4Real") Else _MouseTrap(300, 100, 400, 200) $bTrap4Real = True GUICtrlSetData($idTrap4Real, "Release") EndIf Case Else If Not WinActive($hGUI) And $bTrap4Real Then WinActivate($hGUI) _MouseTrap(300, 100, 400, 200) EndIf EndSwitch WEnd ; Delete the previous GUI and all controls. GUIDelete($hGUI) EndFunc ;==>Example Func Release() _MouseTrap() $bTrap4Real = False GUICtrlSetData($idTrap4Real, "Trap4Real") $bTrap = False GUICtrlSetData($idTrap, "Trap") EndFunc ;==>Release Edited March 21, 2018 by Bilgus Link to comment Share on other sites More sharing options...
Craigo Posted March 21, 2018 Author Share Posted March 21, 2018 Thanks, Bilgus. My use case currently only has a SplashText. Can that even have or lose focus? If your workaround (which does indeed work) can be applied in that scenario, fantastic. I'll give it a go. If it isn't going to work for a SplashText, I guess I can retool my code to use a GUI... For reference, my current code is below. It is using the less-capable but probably sufficient _MouseTrap() because BlockInput() needs #RequireAdmin (a dealbreaker). #include <String.au3> #include <Misc.au3> If StringInStr(@OSArch, "64") <> 0 Then $RegHive = "HKLM64" Else $RegHive = "HKLM" EndIf $PopupWidth = 410 $PopupHeight = 160 $MouseTrapLeftEdge = (@DesktopWidth / 2) - ($PopupWidth / 2) $MouseTrapTopEdge = (@DesktopHeight / 2) - ($PopupHeight / 2) $MouseTrapRightEdge = (@DesktopWidth / 2) + ($PopupWidth / 2) $MouseTrapBottomEdge = (@DesktopHeight / 2) + ($PopupHeight / 2) $TextBase = "Application installation in progress." & @CRLF & @CRLF & "User input will be restricted for the duration of this process." & @CRLF & @CRLF If RegRead($RegHive & "\Software\InHouse", "AppDeploymentInProgress") = 1 Then SplashTextOn("In-House Application Installation", $TextBase, $PopupWidth, $PopupHeight, -1, -1, 4) _MouseTrap($MouseTrapLeftEdge, $MouseTrapTopEdge, $MouseTrapRightEdge, $MouseTrapBottomEdge) While RegRead($RegHive & "\Software\InHouse", "AppDeploymentInProgress") = 1 For $i = 0 To 3 $TextToDisplay = $TextBase & _StringRepeat(" ", $i) & "•" ControlSetText("In-House Application Installation", "", "Static1", $TextToDisplay) Sleep(1000) Next For $i = 4 To 1 Step -1 $TextToDisplay = $TextBase & _StringRepeat(" ", $i) & "•" ControlSetText("In-House Application Installation", "", "Static1", $TextToDisplay) Sleep(1000) Next WEnd EndIf SplashOff() _MouseTrap() Link to comment Share on other sites More sharing options...
Bilgus Posted March 21, 2018 Share Posted March 21, 2018 Personally I don't like the idea of trapping the mouse but SplashTextOn does return a hWnd #include <AutoItConstants.au3> #include <Misc.au3> Local $hWnd = SplashTextOn("Title", "Message goes here.", -1, -1, -1, -1, $DLG_TEXTLEFT, "", 24) WinActivate($hWnd) Local $aPos = WinGetPos($hWnd) If IsArray($aPos) Then ConsoleWrite(StringFormat("X: %d Y: %d W: %d H: %d", $aPos[0], $aPos[1], $aPos[2], $aPos[3]) & @CRLF) _MouseTrap($aPos[0], $aPos[1], $aPos[0] + $aPos[2], $aPos[1] + $aPos[3] + 50) While WinWaitNotActive($hWnd, "", 10) <> 0 ConsoleWrite("De-Activated" & @CRLF) WinActivate($hWnd) _MouseTrap($aPos[0], $aPos[1], $aPos[0] + $aPos[2], $aPos[1] + $aPos[3] + 50) WEnd _MouseTrap() Else ConsoleWrite("Invalid" & @CRLF) EndIf SplashOff() Link to comment Share on other sites More sharing options...
Bilgus Posted March 21, 2018 Share Posted March 21, 2018 Do note the +50 extra added to the height so you can click off the window Link to comment Share on other sites More sharing options...
Craigo Posted March 23, 2018 Author Share Posted March 23, 2018 Thanks again, Bilgus. I agree that messing with the user's input ability is a little heavy-handed, but that's what I have been tasked to do. Can't have users restarting their computers in the middle of an app deployment! Your code was very helpful. In the end, I have a pretty tidy solution: An Adlib function that ensures the splashtext maintains focus Moved the registry test to an Adlib function (with a sizeable delay) I nabbed your idea of using WinGetPos to return the splashtext position/size (much more flexible) A hotkey to toggle mouse trapping Bilgus 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now