installierte Drucker ermitteln / auflisten

  • Aktuell brauchte ich die Information, welche Drucker auf dem jeweiligen PC installiert sind, um danach weitere Aktionen durchzuführen.

    Hier mein kleines Script:

    Spoiler anzeigen

    Zeige

    [autoit]

    ; Ermittlung installierter Drucker

    [/autoit] [autoit][/autoit] [autoit]

    ; die Anzahl 25 ist willkürlich gewählt, so viele Drucker dürften wohl kaum installiert sein
    Dim $Drucker[25]
    Dim $Ausgabe

    [/autoit] [autoit][/autoit] [autoit]

    For $i=1 to 25
    $Drucker[$i] = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts",$i)
    If @error <> 0 then ExitLoop
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $Drucker[0]=$i-1

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 1 to $Drucker[0]
    $Ausgabe &= $Drucker[$j] & @CR
    Next

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"Installierte Drucker", $Ausgabe)

    [/autoit]


    Gruß
    Holger

    • Offizieller Beitrag

    HI,

    oder

    [autoit]

    $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)
    Next

    [/autoit]

    So long,

    Mega

  • Hi zusammen,

    eine schöne Idee. ;)
    Habe beide Skripte ausprobiert, der Skript von (VX-)Rexx läuft bei mir schneller.

    Ich habe vor längerer Zeit ein Tool zum Setzen des Standarddruckers programmiert. Nachteil bei meinen Tool ist die manuelle Konfiguration: ich muss erstmal vorgeben welche Drucker installiert sind.

    Jetzt meine Idee: Eure Skripte so zu erweitern, das man einen Oberfläche angezeigt bekommt in der die installierte Drucker angezeigt werden und man hier einen anderen Drucker als Standarddrucker setzen kann.

    Ist das mögliche? Und wenn ja, dann wie setze ich einen Drucker als Standarddrucker? Kann ich auch den Standarddrucker auslesen für die Anzeigen in der GUI?

  • Hallo Mega,
    um zu solch einer Lösung zu kommen, muß man sich schon ein wenig ?( mit COM auseinandersetzen / auseinandergesetzt haben. Wer dies nicht hat / konnte, braucht schon eine Weile, um nachzuvollziehen, was da passiert. Und OO-Kenntnisse sollten auch vorhanden sein.

    Gruß
    Holger

  • Zitat

    Original von xoma
    wie setze ich einen Drucker als Standarddrucker?

    kurze Anwtort:

    Um z.Bsp. den HP LaserJet 1320 (Postscript) als Standarddrucker festzulegen, gibt es den Kommandozeilenbefehl
    rundll32 printui.dll,PrintUIEntry /y /n "hp LaserJet 1320 PS"

    2 Mal editiert, zuletzt von (VX-)Rexx (18. Juli 2007 um 22:19)

  • Hallo zusammen,

    ich habe das Skript erweitert.
    Es sieht jetzt so aus:

    [autoit]

    ; Ermittlung installierter Drucker
    #include <Array.au3>
    #include <GUIConstants.au3>
    #NoTrayIcon

    [/autoit][autoit][/autoit][autoit]

    ; die Anzahl 25 ist willkürlich gewählt, so viele Drucker dürften wohl kaum installiert sein
    Dim $Drucker[25]
    Dim $Ausgabe
    ;~
    For $i=1 to 25
    $Drucker[$i] = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts",$i)
    If @error <> 0 then ExitLoop
    Next

    [/autoit][autoit][/autoit][autoit]

    Dim $w = 300
    Dim $h = 300
    Dim $bh = 25
    Dim $a = 5 ; abstand

    [/autoit][autoit][/autoit][autoit]

    Local $Form1 = GUICreate("AForm1", $w, $h, @DesktopWidth - $w - 20, 20)

    [/autoit][autoit][/autoit][autoit]

    $Drucker[0]=$i-1
    _ArrayDisplay ($Drucker)
    For $i = 1 to $Drucker[0]
    If $Drucker[$i] <> '' Then
    Assign("Button", $Drucker[$i])
    $Button = GUICtrlCreateButton($Drucker[$i], $a, $a + $bh*$i - $bh, $w - 3*$a, $bh, 0)
    $h = $a + $bh*$i + 1.5*$bh
    EndIf
    Next
    WinMove($Form1, "", @DesktopWidth - $w - 20, 20, $w, $h)

    [/autoit][autoit][/autoit][autoit]

    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button
    ;~ MsgBox(4096, "", GUICtrlRead($Button))
    $befehl = 'rundll32 printui.dll,PrintUIEntry /y /n "' & GUICtrlRead($Button) & '"'
    Run(@ComSpec & " /c " & $befehl, '', @SW_HIDE)

    [/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd

    [/autoit]

    Jetzt habe ich 2 Fragen/Probleme:
    1. Zur Zeit funktioniert nur der letzte Button. Wie kriege ich hin, dass alle Button funktionieren?
    2. Ich würde gerne den Standarddrucker in der GUI fett markieren. Wie finde ich raus welcher Drucker ist als Standard markiert?

    Einmal editiert, zuletzt von xoma (17. Juli 2007 um 16:11)

  • Hallo xoma,

    ich habe mein Script mal erweitert - und sah erst jetzt, dass du ja auch eine GUI fertig hast. :)
    Aber ich denke, du kannst in meinem Script deine Fragen eventuell beantwortet sehen.

    Spoiler anzeigen

    Zeige

    [autoit]

    ; Ermittlung installierter Drucker und Auflistung
    ; aktuellen Standarddrucker in der Liste markieren
    ; Button: neuen Drucker als Standarddrucker setzen
    ; 17.07.2007 (VX-)Rexx

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $Drucker[25]
    Dim $Ausgabe
    Dim $Standarddrucker
    Dim $SetzeStandarddrucker= "rundll32 printui.dll,PrintUIEntry /y /n "

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ###
    $Form1 = GUICreate("Installierte Drucker", 226, 282, 538, 332)
    $List_Drucker = GUICtrlCreateList("", 16, 24, 193, 162)
    $Button_StanddardPRN = GUICtrlCreateButton("gewählten Drucker als Standarddrucker setzen", 16, 208, 193, 57, $BS_MULTILINE)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    For $i=1 to 20
    $Drucker[$i] = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts",$i)
    If @error <> 0 then ExitLoop
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $Drucker[0]=$i-1

    [/autoit] [autoit][/autoit] [autoit]

    For $j = $Drucker[0] To 1 Step -1
    $Ausgabe &= $Drucker[$j] & "|"
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; Standarddrucker ermitteln
    $Standarddrucker=StringSplit(RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows","Device"),",")

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($List_Drucker,$Ausgabe,$Standarddrucker[1])

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Button_StanddardPRN
    Run($SetzeStandarddrucker&'"'&GUICtrlRead($List_Drucker)&'"')
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit]

    3 Mal editiert, zuletzt von (VX-)Rexx (18. Juli 2007 um 22:19)

  • Hi,

    deine Lösung gefällt mir auch, aber jetzt möchte ich mein Skript fertig machen .
    Könnt ihr mir weiter helfen?

  • Hi Holger,

    Danke für dein Script.

    Bei mir muss ich am Anfang die Variable $Ausgabe="" definiert haben, sonst gibt es die folgende Fehlermeldung:
    WARNING: $Ausgabe possibly not declared/created yet
    $Ausgabe &= $Drucker[$j] & "|"
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

    Viele Grüße, Milko

  • Zitat

    Original von milko
    Hi Holger,

    Danke für dein Script.

    Bei mir muss ich am Anfang die Variable $Ausgabe="" definiert haben, sonst gibt es die folgende Fehlermeldung:
    WARNING: $Ausgabe possibly not declared/created yet
    $Ausgabe &= $Drucker[$j] & "|"
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

    Viele Grüße, Milko

    Ja, hatte ich auch gerade bemerkt, dass ich da wohl beim Kopieren eine Zeile zu wenig kopiert hatte. :weinen:

    Ist aber jetzt im Script wieder drin.

    Einmal editiert, zuletzt von (VX-)Rexx (18. Juli 2007 um 22:18)

  • xoma
    das Problem bei dir ist, dass du zwar mehrere Buttons erstellst, aber mit dem selben handle name also er heißt immer $Button deswegen funktioniert das nicht

    probiere es mit einer Schleife

    [autoit]


    Dim $Button[$Drucker[0]]
    For $i = 1 To $anzahldrucker
    $Button[$i] = 0 ;blabla
    Next

    [/autoit]

    2 Mal editiert, zuletzt von leviathan (17. Juli 2007 um 17:32)

  • Hier die Erweiterung für Fettschrift des Standarddruckers:

    [autoit]

    $Standarddrucker=StringSplit(RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows","Device"),",")

    [/autoit][autoit][/autoit][autoit]

    $Drucker[0]=$i-1
    _ArrayDisplay ($Drucker)
    For $i = 1 to $Drucker[0]
    If $Drucker[$i] <> '' Then
    Assign("Button", $Drucker[$i])
    $Button = GUICtrlCreateButton($Drucker[$i], $a, $a + $bh*$i - $bh, $w - 3*$a, $bh, 0)
    If $Drucker[$i]=$Standarddrucker[1] Then
    GUICtrlSetFont(-1,9,700)
    EndIf
    $h = $a + $bh*$i + 1.5*$bh
    EndIf
    Next

    [/autoit]

    Einmal editiert, zuletzt von (VX-)Rexx (18. Juli 2007 um 22:18)

  • Hallo zusammen,

    bin zu blöd?
    Ich kriege deisen Skript nicht zum Laufen:

    [autoit]

    ; Ermittlung installierter Drucker
    #include <Array.au3>
    #include <GUIConstants.au3>
    #NoTrayIcon

    [/autoit][autoit][/autoit][autoit]

    ; die Anzahl 25 ist willkürlich gewählt, so viele Drucker dürften wohl kaum installiert sein
    Global $Drucker[25]
    Global $Ausgabe
    ;~
    For $i=1 to 25
    $Drucker[$i] = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts",$i)
    ;~ $Button[$i] = 0 ;blabla
    If @error <> 0 then ExitLoop
    Next
    Dim $Button[$Drucker[0]]
    ;~ For $i = 1 To $Drucker[0]
    ;~ $Button[$i] = 0 ;blabla
    ;~ Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Dim $w = 300
    Dim $h = 300
    Dim $bh = 25
    Dim $a = 5 ; abstand

    [/autoit][autoit][/autoit][autoit]

    Local $Form1 = GUICreate("AForm1", $w, $h, @DesktopWidth - $w - 20, 20)
    $Standarddrucker=StringSplit(RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows","Device"),",")
    $Drucker[0]=$i-1
    ;~ _ArrayDisplay ($Drucker)
    For $i = 1 to $Drucker[0]
    If $Drucker[$i] <> '' Then
    Assign("Button", $Drucker[$i])
    $Button = GUICtrlCreateButton($Drucker[$i], $a, $a + $bh*$i - $bh, $w - 3*$a, $bh, 0)
    If $Drucker[$i]=$Standarddrucker[1] Then
    GUICtrlSetFont(-1,9,700)
    EndIf
    $h = $a + $bh*$i + 1.5*$bh
    EndIf
    Next

    [/autoit][autoit][/autoit][autoit]

    WinMove($Form1, "", @DesktopWidth - $w - 20, 20, $w, $h)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button
    ;~ MsgBox(4096, "", GUICtrlRead($Button))
    $befehl = 'rundll32 printui.dll,PrintUIEntry /y /n "' & GUICtrlRead($Button) & '"'
    Run(@ComSpec & " /c " & $befehl, '', @SW_HIDE)

    [/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit]


    Kann mir jemand sagen was ich falsch mach.

  • Hi,
    mein Problem ist diese Stelle:

    [autoit]

    Dim $Button[$Drucker[0]]

    [/autoit]


    Die produziert bei mir einen Fehler.
    Was mache ich falsch?

  • Hallo xoma,

    so soll es wohl sein: :tongue:

    [autoit]

    ; Ermittlung installierter Drucker
    #include <Array.au3>
    #include <GUIConstants.au3>
    #NoTrayIcon

    ; die Anzahl 25 ist willkürlich gewählt, so viele Drucker dürften wohl kaum installiert sein
    Global $Drucker[25]
    Global $Ausgabe
    ;~
    For $i=1 to 25
    $Drucker[$i] = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts",$i)
    ;~ $Button[$i] = 0 ;blabla
    If @error <> 0 then ExitLoop
    Next
    Dim $Button_test[25]
    Dim $Standarddrucker_ID

    [/autoit][autoit][/autoit][autoit]

    Dim $w = 300
    Dim $h = 300
    Dim $bh = 25
    Dim $a = 5 ; abstand

    Local $Form1 = GUICreate("AForm1", $w, $h, @DesktopWidth - $w - 20, 20)
    $Standarddrucker=StringSplit(RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows","Device"),",")
    $Drucker[0]=$i-1
    ;~ _ArrayDisplay ($Drucker)
    For $i = 1 to $Drucker[0]
    If $Drucker[$i] <> '' Then
    Assign("Button", $Drucker[$i])
    $Button_ID = GUICtrlCreateButton($Drucker[$i], $a, $a + $bh*$i - $bh, $w - 3*$a, $bh, 0)
    $Button_test[$i] = $Button_ID
    If $Drucker[$i]=$Standarddrucker[1] Then
    GUICtrlSetFont(-1,9,700)
    $Standarddrucker_ID = $Button_ID
    EndIf
    $h = $a + $bh*$i + 1.5*$bh
    EndIf
    Next

    WinMove($Form1, "", @DesktopWidth - $w - 20, 20, $w, $h)


    GUISetState(@SW_SHOW)

    While 1
    $nMsg = GUIGetMsg()
    If $nMsg = $GUI_EVENT_CLOSE Then Exit

    [/autoit][autoit][/autoit][autoit]

    For $i=1 To $Drucker[0]
    If $nMsg = $Button_test[$i] Then
    $befehl = 'rundll32 printui.dll,PrintUIEntry /y /n "' & GUICtrlRead($Button_test[$i]) & '"'
    Run(@ComSpec & " /c " & $befehl, '', @SW_HIDE)
    GUICtrlSetFont($Standarddrucker_ID,9,400)
    $Standarddrucker_ID = $Button_test[$i]
    GUICtrlSetFont($Button_test[$i],9,700)
    EndIf
    Next
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von (VX-)Rexx (18. Juli 2007 um 22:17)