I'm trying to create some AutoIT code for work to make launching our camera systems a bit easier. As of right now, I've been able to get my code to launch a gui, display a list of camera servers that you can add onto, and be able to add new servers to an internal directory. What I'm having a bit of trouble with is the section in which the program is supposed to switch to the newly launched Milestone software, type in the information, and click enter. I've found that the issue is linked to part of the start() function, in which WinWaitActive($handle) either isn't using the correct handle, or maybe the function I'm using is incorrect?
My end goal is to be able to wait 4 seconds, switch focus from whatever current window is selected to the newly opened Milestone window using either its handle or its PID, then send 2 TABs, the ip address, then send ENTER
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>
#Region EDIT THE BELOW INFORMATION-------------------------------------------------------------------------------------------------------------------------------------------
Local Const $milestone = "C:\Program Files\Milestone\XProtect Smart Client\Client.exe" ;Path to software
Local $Title = "Milestone Camera Selector"
#EndRegion-------------------------------------------------------------------------------------------------------------------------------------------------------------------
#Region Script---------------------------------------------------------------------------------------------------------------------------------------------------------------
Local $iFileExists = FileExists($milestone) ;Check if the file exists, returns a 1 or 0
Global $list = IniReadSection(@TempDir & "\" & $Title & "\config.ini","Server") ;Read the ini file, this builds a 2D Array [X][0] is the key [X][1] is the value
HotKeySet("{F1}", "help")
If $iFileExists Then ;If FileExists = 1 (exists) then
If Not FileExists(@TempDir & "\" & $Title) Then ;If config directory does not exists then
Do
DirCreate(@TempDir & "\" & $Title) ;Create a directory in TempDir for the config.ini file to be stored locally
Until FileExists(@TempDir & "\" & $Title)
IniWrite(@TempDir & "\" & $Title & "\config.ini", "Server", "", "")
EndIf
Local $GUI = GUICreate($Title, 267, 115) ;Create the GUI
$start = GUICtrlCreateButton("Start", 40, 72, 65, 25) ;Create a button
$create = GUICtrlCreateButton("Add Server", 160, 72, 65, 25)
$server = GUICtrlCreateCombo("Select Server", 8, 8, 249, 25, $CBS_DROPDOWN) ;Create the combo box
For $i = 1 To UBound($list) - 1 ;Populate combo box with first value (name) from array
If $list[$i][0] <> "" Then GUICtrlSetData($server, $list[$i][0]) ;Ensure array is not empty and fill combox with KEYS
Next
$servername = GUICtrlCreateInput("Server Name", 8, 40, 121, 21)
GUICtrlSetState(-1, $GUI_HIDE)
$serverip = GUICtrlCreateInput("IP Address", 136, 40, 121, 21)
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState(@SW_SHOW)
While 1 ;Enter loop until user closes or presses button
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE ;Exit when closed
Exit
Case $start ;Store selection into variable, delete the GUI, and run the start function
$selection = GUICtrlRead($server)
If $selection <> "Select Server" Then
GUIDelete()
start()
EndIf
Case $create
If GUICtrlRead($create) = "Add Server" Then
GUICtrlSetState($servername, $GUI_SHOW)
GUICtrlSetState($serverip, $GUI_SHOW)
GUICtrlSetData($create, "Create")
Else
If (GUICtrlRead($servername) <> "" And GUICtrlRead($servername) <> "Server Name" And GUICtrlRead($serverip) <> "" And GUICtrlRead($serverip) <> "IP Address") Then
IniWrite(@TempDir & "\" & $Title & "\config.ini", "Server", GUICtrlRead($servername), GUICtrlRead($serverip))
GUICtrlSetState($servername, $GUI_HIDE)
GUICtrlSetState($serverip, $GUI_HIDE)
GUICtrlSetData($create, "Add Server")
Else
MsgBox($MB_ICONINFORMATION, $Title, "Invalid Server Name and IP Address.")
EndIf
For $i = UBound($list) - 1 To 0 Step -1
_GUICtrlComboBox_DeleteString($server, $i)
Next
Local $list = IniReadSection(@TempDir & "\" & $Title & "\config.ini","Server")
For $i = 1 To UBound($list) - 1
If $list[$i][0] <> "" Then GUICtrlSetData($server, $list[$i][0])
Next
EndIf
EndSwitch
WEnd
Else ;otherwise, message
MsgBox($MB_SYSTEMMODAL, "", "Milestone XProtect wasn't found on this computer" & @CRLF)
EndIf
Func start()
$iPID = Run($milestone,"", @SW_SHOWNOACTIVATE) ;Runs the software and returns the Process ID
Sleep(4000) ;sleep for 4 seconds
If @error Then MsgBox(0, $Title, "The program could not launch.") ;If Run returns a 0 or error, there was a problem
$handle = _GetHandleFromPID($iPID) ;Retrieve the handle of the program ran, jump to the function below
If $handle = 0 Then MsgBox(0, $Title, "The handle could not be found.") ;If the Handle returned is 0, there was no match
Sleep(1000)
WinWaitActive($handle) ;Wait for the program to be activated
Send("{TAB}") ;send keystrokes to active window
Send("{TAB}")
For $i = 0 to UBound($list) - 1 ;Find the IP address that matches the selection and send it
If $list[$i][0] = $selection Then Send($list[$i][1])
Next
Send("{ENTER}")
Exit ;Exit for now until you can capture a succesful run
EndFunc
func _GetHandleFromPID($PID) ;Call function with the PID returned from Run function
$WinList = WinList() ;Assign WinList to a variable
for $i = 1 to $WinList[0][0] ;Run through each Window in WinList, 2D array [titles][handles]
If WinGetProcess($WinList[$i][1]) = $PID then ;Look for a Window with the correct PID
Return $WinList[$i][1] ;Assign the matching Windows handle to the variable
EndIf
Next
Return 0 ;Return 0 if no matches were found
EndFunc
Func help()
ShellExecute(@TempDir & "\" & $Title & "\config.ini")
EndFunc
#EndRegion--------------------------------------------------------------------------------------------------------------------------------------------------------------------
Once again, any help would be greatly appreciated in helping me finish this project I started months ago. Also, if you think this would be easier to achieve in a different programming language like python or AutoHotkey, please let me know! :)