Peter Smick Posted November 21, 2016 Share Posted November 21, 2016 I am working on an AutoIt script that will install the QuickLaunch toolbar to a user's desktop after they login to the network. The compiled AutoitScript (AddQL.EXE) is run by a network VBS login script. When I run the AutoIt script by itself, it runs fine and give no errors. When I manually run the VBS login script, the AutoIt script runs fine. But when the user is actually logging in to the network and the login script is triggered, the AutoIt script gives an Error: Subscript used on non-accessible variable message, and the script fails. Here is the AutoIt script for AddQL.EXE which I think properly handles the only array present ($oPosition): expandcollapse popup#NoTrayIcon ;#RequireAdmin Dim $strToolbarFolder, $oPosition[4], $AddRemove $strToolBarFolder = "%userprofile%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch" ; Disable user input from the mouse and keyboard ;BlockInput(1) Sleep(500) ControlFocus("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ReBarWindow321]") ; Right click on the taskbar $oPosition = ControlGetPos("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ReBarWindow321]") ;MsgBox (1,"oPosition[2] and [3]", "oPosition[2] = " & $oPosition[2] & " and oPosition[3] = " & $oPosition[3]) ControlFocus("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ReBarWindow321]") ControlClick("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ReBarWindow321]", "secondary", 1, $oPosition[2], $oPosition[3]) ; Sleep and send T to select the Toolbar and N for "New toolbar..." Send("T") Send("{RIGHT}") Sleep(500) Send("N") Sleep(500) ; Wait for the "New Toolbar - Choose a folder" window If Not WinWaitActive("New Toolbar - Choose a folder", "", 3) Then Exit 1 EndIf ; Lower send delays to speed up typing Opt("SendKeyDelay", 1) Opt("SendKeyDownDelay", 1) ; Type the name of the folder for the new toolbar Send($strToolbarFolder) ; Set send delays to default values again Opt("SendKeyDelay", 5) Opt("SendKeyDownDelay", 5) ; Go to the folder and select the "Select Folder" button Send("{ENTER}") Sleep(500) Send("{Tab}{ENTER}") ;Turn off text and titles for QL Toolbar ControlFocus("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ReBarWindow321]") $oPosition = ControlGetPos("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ReBarWindow321]") ;MsgBox (1,"oPosition(2) and (3)", "oPosition(2) = " & $oPosition[2] & " and oPosition(3) = " & $oPosition[3]) ControlFocus("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ReBarWindow321]") ;MsgBox (0,"oPosition(2) and (3)", "oPosition(2) = " & $oPosition[2] & " and oPosition(3) = " & $oPosition[3]) ControlClick("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ReBarWindow321]", "secondary", 1, $oPosition[2], $oPosition[3]) ;ControlClick("[CLASS:Shell_TrayWnd]", "", "", "secondary", 1, $oPosition[2], $oPosition[3]) Send("x") Sleep(200) ControlClick("[CLASS:Shell_TrayWnd]", "", "[CLASSNN:ReBarWindow321]", "secondary", 1, $oPosition[2], $oPosition[3]) Send("w") Send("{ENTER}") Sleep(200) ; Enable user input from the mouse and keyboard BlockInput(0) Exit 0 And here is how I am calling it in the network VBS login script (Partial): ... Sub FirstLogin dim strQLFile strQLFile=EnvString("USERPROFILE")& "\AppData\Roaming\Microsoft\AddQL.exe" If objFSO.FileExists(strQLFile) Then 'objShell.Run strQLFile, 0, True objShell.Exec(strQLFile) objFSO.DeleteFile(strQLFile) End If End Sub ... In the VBS script, the function EnvString simply gets the value of the %userprofile% variable from the local environment. I have tried the VBS script using both the .Run and .Exec methods with no perceptible difference on the error message. Can anyone shed any light on why this error message should be popping up under these circumstances? TIA, Peter Smick Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted November 21, 2016 Moderators Share Posted November 21, 2016 Peter Smick, Quote I think properly handles the only array present ($oPosition) I am afraid not - you are accessing the array elements without first testing that the array actually exists - which is why you get an error. When the script runs on log in, tit cannot find the position of the control - perhaps you need to Sleep a while before running the ControlGetPos line, or perhaps loop using WinExists until the Tray_Wnd is actually present. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Peter Smick Posted November 21, 2016 Author Share Posted November 21, 2016 1 hour ago, Melba23 said: Peter Smick, I am afraid not - you are accessing the array elements without first testing that the array actually exists - which is why you get an error. When the script runs on log in, tit cannot find the position of the control - perhaps you need to Sleep a while before running the ControlGetPos line, or perhaps loop using WinExists until the Tray_Wnd is actually present. M23 Good thought. I will certainly try the sleep and other suggestions you made and will report back. Thanks, Peter. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted November 21, 2016 Moderators Share Posted November 21, 2016 Peter Smick, By all means. But when you reply, please use the "Reply to this topic" button at the top of the thread or the "Reply to this topic" editor at the bottom rather than the "Quote" button - I know what I wrote and it just pads the thread unnecessarily. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Peter Smick Posted November 21, 2016 Author Share Posted November 21, 2016 (edited) Excellent. WinWaitActive did the trick. This script is really used only the first time someone logs into the network, and it takes much longer than the normal login to create the new user's profile. I had forgotten about this timing issue. Thank you so much. Can I ask whether you saw the earlier post about this same script titled Manipulating the Windows 10 Taskbar? There I asked if anyone had any ideas about how to reposition the dividing bar between the QuickLaunch Toolbar and the rest of that taskbar, or differently, how to move the QL toolbar all the way to the left. If you had any thoughts on that, I would be doubly forever indebted. Peter Edited November 21, 2016 by Peter Smick Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted November 21, 2016 Moderators Share Posted November 21, 2016 Peter Smick, Glad I could help. How would you move the QL toolbar to where you wish it to be if you were to do it yourself? M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
Peter Smick Posted November 22, 2016 Author Share Posted November 22, 2016 When the QL Toolbar is installed on the taskbar and the taskbar is unlocked, a small vertical divider bar appears separating the main taskbar from the QL Toolbar. (If multiple toolbars are installed, then they are separated from each other by a similar divider.) When the QL Toolbar is first installed, it appears on the right end of the taskbar. To adjust it manually, I would grab its divider bar with a mouse and slide it all along the taskbar to the left until the QLToolBar and the main taskbar "switch places". At this point the QL Toolbar is very wide and so I would next grab the Main Taskbar's divider and drag it some distance to the left to effectively shorten the QL Toolbar. Assuming that my script above has correctly identified the QL Toolbar as a control on the Taskbar (and that it is in fact a control), I have tried to use ControlMove to relocate it within the Taskbar "window" but the command does not seem to do anything. Also, using AutoInfo, position info does not seem to change when I manually move the QL Toolbar divider or move the toolbar manually. I have also not had any luck recording a mouse-based script, and would prefer not to have to rely on a mouse for this. This is as far as my thinking has taken me so far. Peter 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