Jump to content

Window Titles and Text


 Share

Recommended Posts

I am having problems with Window Titles and Text. I have a window with a partial title of "Connect to Printer" that has the following visible text:

OK

Windows cannot connect to the printer. The network address is invalid

If my code reads

If WinExists("Connect to Printer", "OK")

It works as expected, but if my code reads

If WinExists("Connect to Printer", "Windows cannot connect to")

It doesn't . The reason that I need to be more specific is because depending on the situation, I could have two windows that are only different by the second line of visible text.

I hope this makes sense.

Thanks!

Link to comment
Share on other sites

Yeah, I did try that with no luck. I've tried checking for proper capitalization and everything is correct there. Maybe I'm not using WinExists correctly. Here is my code.

run("RUNDLL32 PRINTUI.DLL,PrintUIEntry /in /n \\Server\Printer")
Opt("WinTitleMatchMode", 2)
WinWait("Connecting to")
While WinExists("Connecting to", "")
WinWait("Connect to Printer", "")
If WinExists("Connect to Printer", "Windows cannot connect to the printer") Then
        WinActivate("Connect to Printer", "Windows cannot connect to the printer")
        ControlClick("Connect to Printer", "Windows cannot connect to the printer", "Button 1")
        Exit
ElseIf WinExists("Connect to Printer", "You are about to connect to a printer") Then
        WinActivate("Connect to Printer", "You are about to connect to a printer")
        ControlClick("Connect to Printer", "You are about to connect to a printer", "Button 1")
        Exit
ElseIf WinExists("Connect to Printer", "The server for the printer does not have the correct printer driver installed") Then
        WinActivate("Connect to Printer", "The server for the printer does not have the correct printer driver installed")
        ControlClick("Connect to Printer", "The server for the printer does not have the correct printer driver installed", "Button2")
        Exit
    Else
        Exit
EndIf
WEnd

Thanks

Edited by noverley
Link to comment
Share on other sites

run("RUNDLL32 PRINTUI.DLL,PrintUIEntry /in /n \\Server\Printer")
WinWait("Connect to Printer")
$hwnd = WinGetHandle("Connect to Printer")
$text = WinGetText($hwnd)
$text = StringMid($text,StringInStr($text,@LF,0,2)+1)
$first8letters = StringLeft($text,8)
Switch $first8letters
    Case "Windows "
        ControlClick($hwnd,'',2)
    Case "You are "
        ControlClick($hwnd,'',2)
    Case "The serv"
        ControlClick($hwnd,'',2)
EndSwitch

I checked and this works for me...

by the way use "Auotit v3 info" to see what's the ID of the control... "Button1" was the ClassnameNN... the ID was 2

hope that helps you

Link to comment
Share on other sites

It seemed to work, but I just realized that there is the possibility that another window with a different title might pop up. The title is "Hardware Installation". Should the following work? I basically left the title blank for WinGetHandle.

I tried it but the ControlClick doesn't get sent to this window.

run("RUNDLL32 PRINTUI.DLL,PrintUIEntry /in /n \\Server\Printer")
WinWait("Connecting to")
While WinExists("Connecting to")
;WinWait("Connect to Printer")
;$hwnd = WinGetHandle("Connect to Printer")
$hwnd = WinGetHandle("")
$text = WinGetText($hwnd)
$text = StringMid($text,StringInStr($text,@LF,0,2)+1)
$first8letters = StringLeft($text,8)
Switch $first8letters
    Case "Windows "
        ControlClick($hwnd,'', 2)
    Case "You are "
        ControlClick($hwnd,'', 6)
    Case "The serv"
        ControlClick($hwnd,'', 2)
    Case "The soft"
    ControlClick($hwnd,'', 5303)
EndSwitch
WEnd
Edited by noverley
Link to comment
Share on other sites

I have a tool that will do what you need. Take a look at this script. It is a mass printer installer tool for Windows print servers. It will install the printers on a machine level so that no matter who logs in, they can print. It will also set the default, and delete printers, all in one step.:

#cs
    Network Printer Utility 1.0 beta
    Designed by Volly
    July 2006
    A big THANK YOU goes to big_daddy. His help
    was invaluable in fixing some issues. 
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    History
    July 2006: Initial release.
    
    ---------------
    Known issues:
    Will not work on Novell servers.
    
#ce
#include <GuiConstantsEX.au3>
#include <WindowsConstants.au3>
#include <Process.au3>
#include <Array.au3>
$g_szVersion = "PrintInst.exe"
If WinExists($g_szVersion) Then Exit
Opt("TrayIconDebug", 1);debug is on

Dim $hService, _
        $data, _
        $sPrinter, _
        $sPrinterList, _
        $font = "Comic Sans MS", _
        $Input[12], $Combo[7], $radio[7], _
        $check[11], $Button[6]

Global Enum Step + 25 _
        $CON_POS_1 = 25, _
        $CON_POS_2, _
        $CON_POS_3, _
        $CON_POS_4, _
        $CON_POS_5, _
        $CON_POS_6, _
        $CON_POS_7, _
        $CON_POS_8, _
        $CON_POS_9, _
        $CON_POS_10, _
        $CON_POS_11

GUICreate("", 600, 290, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
GUICtrlCreateLabel("\\", 20, 54, 10, 20)
$iniread_1 = IniRead(@ScriptDir & "/npu.ini", "SERVER", "SERVER", "")
$iniread_2 = IniRead(@ScriptDir & "/npu.ini", "Printers", "PLIST", "")
iniwrite(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "")
$iniread_3 = IniRead(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "")
$LocalPrinters = StringSplit($iniread_3, "|")
If $LocalPrinters[0] > 10 Then
    ReDim $LocalPrinters[11]
EndIf

$Input[1] = GUICtrlCreateInput($iniread_1, 35, 50, 100, 20)

For $i = 2 To 11
    $Input[$i] = GUICtrlCreateInput("", 270, Eval("CON_POS_" & $i - 1), 270, 21)
    If ($i - 1) <= $LocalPrinters[0]Then
        GUICtrlSetData(-1, $LocalPrinters[$i - 1])
    EndIf
Next

For $i = 1 To 6
    $Combo[$i] = GUICtrlCreateCombo("", 20, Eval("CON_POS_" & $i + 2), 170, 21)
    GUICtrlSetData(-1, $iniread_2)
    $radio[$i] = GUICtrlCreateRadio("", 210, Eval("CON_POS_" & $i + 2), 15, 21)
Next

For $i = 1 To 10
    $check[$i] = GUICtrlCreateCheckbox("", 550, Eval("CON_POS_" & $i), 20, 20)
Next

GUICtrlCreateLabel("Currently install printers", 270, 3, 200, 21)
GUICtrlCreateLabel("Delete", 550, 7, 100, 21)
GUICtrlCreateGroup("Default", 200, 62, 50, 160)

$Button[1] = GUICtrlCreateButton("Run", 20, 225, 35, 30)
$Button[2] = GUICtrlCreateButton("Exit", 65, 225, 35, 30)
$Button[3] = GUICtrlCreateButton("Find", 146, 50, 43, 20)
$Button[4] = GUICtrlCreateButton("Find", 498, 3, 43, 20)
$Button[5] = GUICtrlCreateButton("Restart Spooler", 110, 225, 80, 30)

$Label_1 = GUICtrlCreateLabel("   Network Printer Utility" & @CRLF & "for Windows Print Servers", 20, 0, 240, 50)
GUICtrlSetFont(-1, 10, 400, "", $font)
$_dummy = GUICtrlCreateDummy()

GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Button[1]
            _Rprinter()         
            _instprint()
            MsgBox(0, "", "Done!", 3)
        Case $Button[2]
            ExitLoop
        Case $Button[3]
            $data = GUICtrlRead($Input[1], 0)
            _netprint1()
        Case $Button[4]
            _getinstalledPrinters()
        Case $Button[5] 
            _restart();restarts the print spooler. 
        Case Else
           ;;;
    EndSwitch
WEnd

Exit

Func _netprint1()
    $hService = ObjGet("winmgmts:{impersonationLevel=impersonate}!" & "\\" & $data & "\root\cimv2")
    If @error Then
        MsgBox(48, "ERROR", "No Printers Found. Possible issues: " & @CRLF _
                 & "" & @CRLF _
                 & "  1. The Windows Print Server name has been entered in incorrectly." & @CRLF _
                 & "  2. You are trying to access a Novell Server. This utility does not support Novell Print Servers." & @CRLF _
                 & "  3. There are no printers shared on the Windows Print Server you selected.")
    Else
        _np2()
    EndIf
EndFunc  ;==>_netprint1

Func _np2()
    Local $i = 0
    Local $sPrinters = ""
    Local $aArray[1]
    
    SplashTextOn("", "Gathering printers, please wait...", 150, 75)
    
    For $y = 1 To 6
        GUICtrlSetData($Combo[$y], "")
    Next
    IniWrite(@ScriptDir & "/npu.ini", "Printers", "PLIST", "")
    
    $oPrinterList = $hService.ExecQuery ("Select * From Win32_Printer")
    
    For $oPrinter In $oPrinterList
        ReDim $aArray[$i + 1]
        $aArray[$i] = StringUpper($oPrinter.name)
        $i += 1
    Next
    
    _ArraySort($aArray)
    
    For $i = 0 To UBound($aArray)-1
        For $y = 1 To 6
            GUICtrlSetData($Combo[$y], $aArray[$i])
        Next
    Next
        
    $iElements = UBound($aArray) - 1
    For $x = 0 To $iElements
        If $x = $iElements Then
            $sPrinters &= $aArray[$x]
        Else
            $sPrinters &= $aArray[$x] & "|"
        EndIf
    Next
    
    IniWrite(@ScriptDir & "/npu.ini", "Printers", "PLIST", $sPrinters)
    $dataget2 = GUICtrlRead($Input[1], 0)
    IniWrite(@ScriptDir & "/npu.ini", "SERVER", "SERVER", $dataget2)
    SplashTextOn("", "Select what printers you wish to install", 150, 75)
    Sleep(2000)
    SplashOff()
EndFunc  ;==>_np2

Func _instprint()
    Local $ComboGet[7], $RadioGet[7]
    
    SplashTextOn("", "Installing printer, please wait...", 150, 75)
    
    $InputGet = GUICtrlRead($Input[1], 0)
    
    For $i = 1 To 6
        $ComboGet[$i] = GUICtrlRead($Combo[$i], 0)
        $RadioGet[$i] = GUICtrlRead($radio[$i], 0)
    Next
    
    For $i = 1 To 6
        If $ComboGet[$i] <> "" Then             
            RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /ga /c\\" & @ComputerName & " /n\\" & $InputGet & "\" & $ComboGet[$i])  
        EndIf
    Next
    _RunDOS("NET STOP spooler")
    _RunDOS("NET START spooler")
    sleep(10000)
    For $i = 1 To 6 
            If $RadioGet[$i] = 1 Then
                If $ComboGet[$i] <> "" Then
                RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n\\"&$iniread_1&"\"& $ComboGet[$i])
                endif
            EndIf   
            GUICtrlSetData($Combo[$i],"")
            GUICtrlSetState($radio[$i], $GUI_UNCHECKED)
            sleep(50)
            GUICtrlSetData($Combo[$i],$iniread_2)            
    Next
    SplashOff()
EndFunc  ;==>_instprint

func _restart()
    SplashTextOn("", "Stopping Print Spooler, please wait...", 150, 75)
    _RunDOS("NET STOP spooler")
    SplashOff()
    SplashTextOn("", "Starting Print Spooler, please wait...", 150, 75)
    _RunDOS("NET START spooler")
    SplashOff()
EndFunc 

Func _getinstalledPrinters()
    
    SplashTextOn("", "Gathering installed printers, please wait...", 200, 75)
    
    IniWrite(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "")
    $hService = ObjGet("winmgmts:{impersonationLevel=impersonate}!" & "\\" & @ComputerName & "\root\cimv2")
    $sPrinterList = $hService.ExecQuery ("Select * From Win32_Printer")
    ConsoleWrite('$sPrinterList.count = ' & $sPrinterList.count & @LF)
    For $sPrinter In $sPrinterList
        ConsoleWrite('$sPrinter.name = ' & $sPrinter.name & @LF)
        $rd3 = IniRead(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "")
        IniWrite(@ScriptDir & "/npu.ini", "Printers", "LOCAL", $rd3 & $sPrinter.name & "|")
    Next
    $local = StringSplit(IniRead(@ScriptDir & "/npu.ini", "Printers", "LOCAL", ""), "|")
    If UBound($local) < 11 Then ReDim $local[11]
    For $i = 1 To 10
        GUICtrlSetData($Input[$i + 1], $local[$i])
    Next
    
    SplashOff()
EndFunc  ;==>_getinstalledPrinters

Func _Rprinter()
    Local $InputGet[11]
    For $i = 2 To 11
        $InputGet[$i - 1] = GUICtrlRead($Input[$i])
    Next
    For $i = 1 To 10
        If GUICtrlRead($check[$i]) = 1 Then
            SplashTextOn("", "Removing printer, please wait...", 150, 50)
            GUICtrlSetState($check[$i], $GUI_UNCHECKED)
            sleep(1000)
            If $InputGet[$i] <> "" Then
                $str = StringLeft($InputGet[$i], 2)
                If $str = "\\" Then
                    RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /dn /n /c\\" & @ComputerName & " /n" & $InputGet[$i])
                ;RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /q /c\\" & @ComputerName & " /n" & $InputGet[$i]);mine original
                ;RunWait(@ComSpec & ' /c RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /dn /q /n "' & $ret & '"', '', @SW_HIDE);danny35
                    GUICtrlSetData($InputGet[$i], "")
                Else
                    RunWait(@SystemDir & '\RUNDLL32 PRINTUI.DLL,PrintUIEntry /dl /q /n "' & $InputGet[$i] & '" /c\\' & @ComputerName)
                EndIf
            EndIf
        EndIf
    Next
    
EndFunc  ;==>_Rprinter
Link to comment
Share on other sites

Thanks for you reply but I'm not sure if it will work for my situation. I am running a Novell network.

However, I did get the script working the way I want it to. I just don't know if it is the best way to do it.

Here is the script.

run("RUNDLL32 PRINTUI.DLL,PrintUIEntry /in /n \\Server\Printer")
WinWait("Connecting to")
While WinExists("Connecting to")
If WinExists("Connect to Printer") then
$hwnd = WinGetHandle("Connect to Printer")
$text = WinGetText($hwnd)
$text = StringMid($text,StringInStr($text,@LF,0,2)+1)
$first8letters = StringLeft($text,8)
Switch $first8letters
    Case "Windows "
        ControlClick($hwnd,'', 2)
    Case "You are "
        ControlClick($hwnd,'', 6)
    Case "The serv"
        ControlClick($hwnd,'', 2)
EndSwitch
ElseIf WinExists("Hardware Installation") Then
    ControlClick("Hardware Installation",'',5303)
Else
EndIf
WEnd
Edited by noverley
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...