Cyri Posted February 26, 2009 Posted February 26, 2009 (edited) I'm working with Windows SteadyState and there is no fully unattended way to configure it. Sounds like a job for AutoIT. The main window has three link(hotspots) for "Set Computer Restrictions", "Schedule Software Updates", and "Protect the Hard Disk". See screenshot below for details.My problem is that I can't seem to get ControlClick to click them. Here is my code:Opt("WinTitleMatchMode",4) ;Set variables $MainWin = "Windows SteadyState v2.5" $HelpWin = "Windows SteadyState" ; Run Windows SteadyState UI If FileExists("C:\Program Files\Windows SteadyState\SCTUI.exe") Then Run("C:\Program Files\Windows SteadyState\SCTUI.exe") EndIf ; Close help file WinWait("[TITLE:" & $MainWin & "]","",20) If WinExists("[TITLE:" & $HelpWin & "; CLASS:HH Parent]") Then WinClose("[TITLE:" & $HelpWin & "; CLASS:HH Parent]") EndIf ; Open Computer Restrictions $hWND = WinGetHandle ("[TITLE:" & $MainWin & "]") $hControl = ControlGetHandle($hWND,"","[CLASS:#32770; INSTANCE:2]") ControlClick($hWND,"",$hControl)I have verified that the control handle is being assigned to $hControl, but it won't click. I'm wondering if these controls are different. Like maybe these screens are HTML behind the scenes.I've found two workarounds which are MouseClick and doing a sendkey solution with Tab and Space to select the control, but neither are ideal. Anyone have another idea? Edited March 3, 2009 by Cyri
Ealric Posted February 27, 2009 Posted February 27, 2009 Cyri said: I'm working with Windows SteadyState and there is no fully unattended way to configure it. Sounds like a job for AutoIT. The main window has three link(hotspots) for "Set Computer Restrictions", "Schedule Software Updates", and "Protect the Hard Disk". See screenshot for details. Windows SteadyState (main screen) My problem is that I can't seem to get ControlClick to click them. Here is my code: Opt("WinTitleMatchMode",4) ;Set variables $MainWin = "Windows SteadyState v2.5" $HelpWin = "Windows SteadyState" ; Run Windows SteadyState UI If FileExists("C:\Program Files\Windows SteadyState\SCTUI.exe") Then Run("C:\Program Files\Windows SteadyState\SCTUI.exe") EndIf ; Close help file WinWait("[TITLE:" & $MainWin & "]","",20) If WinExists("[TITLE:" & $HelpWin & "; CLASS:HH Parent]") Then WinClose("[TITLE:" & $HelpWin & "; CLASS:HH Parent]") EndIf ; Open Computer Restrictions $hWND = WinGetHandle ("[TITLE:" & $MainWin & "]") $hControl = ControlGetHandle($hWND,"","[CLASS:#32770; INSTANCE:2]") ControlClick($hWND,"",$hControl) I have verified that the control handle is being assigned to $hControl, but it won't click. I'm wondering if these controls are different. Like maybe these screens are HTML behind the scenes. I've found two workarounds which are MouseClick and doing a sendkey solution with Tab and Space to select the control, but neither are ideal. Anyone have another idea? There are 3 different advanced classes for those controls. They are: Residing within #32770 Class: Static; Instance: 8 (Set Computer Restrictions) Class: Static; Instance: 13 (Schedule Software Updates) Class: Static; Instance: 20 (Protect the Hard Disk) My Projects: [topic="89413"]GoogleHack Search[/topic], [topic="67095"]Swiss File Knife GUI[/topic], [topic="69072"]Mouse Location Pointer[/topic], [topic="86040"]Standard Deviation Calculator[/topic]
Cyri Posted March 1, 2009 Author Posted March 1, 2009 Ealric said: There are 3 different advanced classes for those controls. They are:Residing within #32770Class: Static; Instance: 8 (Set Computer Restrictions)Class: Static; Instance: 13 (Schedule Software Updates)Class: Static; Instance: 20 (Protect the Hard Disk)Thanks for the info. I'll try that tomorrow at the office. How did you come across these instances? I was using the AutoIT window Info tool and came up with instances 2, 3, and 11 as possibilities for "Set Computer Restrictions", but I never came across instance 8.
Cyri Posted March 3, 2009 Author Posted March 3, 2009 (edited) Actually, those instances you specified are merely the static text controls in the window and not the actual buttons themselves. I did find out that if you move the mouse over one of the buttons and then do a ControlClick it works. According to uuSpy it shows a WM_HITTEST being performed to verify whether the mouse is over one of the buttons which is why the ControlClick requires the mouse be over the button in order for it to work. Here is a sample of the code I'm using now to flip between those initial three buttons. Not perfect since it relies on MouseMove, but better than what I was doing. I'll keep digging to see if this can be automated without the MouseMove. expandcollapse popup#Include <WinAPI.au3> Opt("WinTitleMatchMode",4) Opt("WinWaitDelay",1000); Without this the ControlGetHandle doesn't get the handle to the control, looks like a timing issue related to how the form is drawn. Opt("MouseCoordMode",2) ;Set variables $MainWin = "Windows SteadyState v2.5" $HelpWin = "Windows SteadyState" $SetCompRes = 2 $SchSoftUpd = 4 $ProtectHD = 6 ; Run Windows SteadyState UI If FileExists("C:\Program Files\Windows SteadyState\SCTUI.exe") Then Run("C:\Program Files\Windows SteadyState\SCTUI.exe") EndIf ; Initialize window, close help file (if necessary) WinWait("[TITLE:" & $MainWin & "]","",10) If WinExists("[TITLE:" & $MainWin & "]") Then $hWND = WinGetHandle("[TITLE:" & $MainWin & "]") Else Exit EndIf If WinExists("[TITLE:" & $HelpWin & "; CLASS:HH Parent]") Then WinClose("[TITLE:" & $HelpWin & "; CLASS:HH Parent]") EndIf ; Go to Set Computer Restrictions ChangeScreen($hWND, $SetCompRes) Func ChangeScreen($hWND, $CI) $hClass = _WinAPI_GetClassName($hWND) $hControl = ControlGetHandle($hWND,"","[CLASS:" & $hClass & "; INSTANCE:" & $CI & "]") $Pos = ControlGetPos($hWND,"",$hControl) WinActivate($hWND) BlockInput(1) MouseMove($Pos[0],$Pos[1]) ControlClick($hWND, "", $hControl) BlockInput(0) EndFunc Edited March 3, 2009 by Cyri
James Posted March 3, 2009 Posted March 3, 2009 Just out of curiosity, why do you block input and then ControlClick, that works with hidden windows too. Blog - Seriously epic web hosting - Twitter - GitHub - Cachet HQ
Cyri Posted March 3, 2009 Author Posted March 3, 2009 JamesBrooks said: Just out of curiosity, why do you block input and then ControlClick, that works with hidden windows too.Because of the MouseMove. The ControlClick won't work unless the mouse is over it. If I don't block input theres a chance someone could move the mouse off the control and the ControlClick would fail. Unless the time between the MouseMove and ControlClick commands is so fast that isn't possible? I don't know, but to be on the safe side I blocked input.
James Posted March 3, 2009 Posted March 3, 2009 Ahh I missed that. Blog - Seriously epic web hosting - Twitter - GitHub - Cachet HQ
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