Merkwürdige Rückgabe beim Auslesen von Combobox einträgen

  • Hallo Zusammen,

    Ich habe ein Problem mit einer Combobox in einem Drucken-Dialog. Ich gehe wie folgt vor: Wenn das Skript gestartet wird, lese ich alle installierten Drucker aus und biete diese zur Auswahl an. Im weiteren Verlauf des Scriptes komme ich zu einem Drucken-Dialog. Hier will ich den zuvor gewählten Drucker selektieren.

    [autoit]


    ControlCommand ("Drucken","","[CLASS:ComboBox; INSTANCE:1]","SelectString", $printerA4)

    [/autoit]


    Da die Auswahl nicht funktioniert, habe ich mir alle Items ausgeben lassen:

    [autoit]

    $Combo = ControlGetHandle ( "Drucken", "", "[CLASS:ComboBox; INSTANCE:1]" )
    $sPrinter = _GUICtrlComboBox_GetList($Combo)
    MsgBox(0,"Printer",$sPrinter)

    [/autoit]

    Die Messagebox zeigt dann, dass in der Combobox merkwürdige Zeichen verwendet werden (siehe Anhang). Wie komme ich an den richtigen Listeneintrag? Vielleicht ist das ein Zeichensatzproblem? UTF-( oder sowas?

    Vielen Dank für eure Hilfe.

    Gruß
    Stefan

  • zu wenig Hintergrund Informationen

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Welche Hintergrundinformationen sind noch wichtig?

    Das Drucken-Dialogfeld rufe ich über STRG+P im "Adobe Reader XI" auf.

    Die Vorauswahl des Druckers durch den Nutzer erfolgt wie folgt:

    [autoit]


    Func GetPrinterList()
    Local $arrPrinterList[1] ;doubt there are more than 30 printers

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

    For $i = 1 To 1000
    Local $reg = RegEnumVal( "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices", $i)
    If @error = -1 Then ExitLoop
    _ArrayAdd($arrPrinterList, $reg)
    Next

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

    _ArrayDelete($arrPrinterList, 0)

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

    Return $arrPrinterList
    EndFunc

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

    ; COMBO
    Local $printers = GetPrinterList()

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

    GUICtrlCreateLabel("Drucker A4 + A3", 10, 120, 90, 20)
    Global $comboA4 = GUICtrlCreateCombo("", 140, 120, 200, 20)
    GuiCtrlSetData($comboA4, "|" & _ArrayToString($printers))

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

    Wenn es dann zum Druckdialog kommt soll der am Anfang gewählte Drucker ausgewählt werden:

    [autoit]


    Send("{CTRLDOWN}p{CTRLUP}")

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

    Sleep(300)

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

    _WinWaitActivate("Drucken","")

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

    Sleep(300)

    ;Message Box zum debugen:
    ;-----------------------------------
    $Combo = ControlGetHandle ( "Drucken", "", "[CLASS:ComboBox; INSTANCE:1]" )
    $sPrinter = _GUICtrlComboBox_GetList($Combo)
    MsgBox(0,"Printer",$sPrinter)
    ;-----------------------------------

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

    If ($format = "A4" OR $format = "A3") Then
    ControlCommand ("Drucken","","[CLASS:ComboBox; INSTANCE:1]","SelectString", $printerA4)
    Else
    ControlCommand ("Drucken","","[CLASS:ComboBox; INSTANCE:1]","SelectString", $printerA2)
    EndIf

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

    Sleep(500)

    [/autoit]
  • MrIcemanF14:
    was willst du denn mit deinem script als ergebnis erreichen? deshalb auch die frage von Schnuffel
    willst du einem anderen user ein eigenes druckmenü geben? mit Strg+P ruft man ja schon das druckmenü auf, wo man sich den drucker aussuchen kann!
    eventuell kannst du vorher dann auch den standarddrucker entsprechend setzen
    oder möchtest du einen druck komplett automatisieren? das geht dann auch über kommandozeile ...

    gruß gmmg

  • Hallo,

    es geht um den Ausdruck von sehr vielen PDF-Dateien. Diese sollen je nach Papier-Format auf zwei verschiedenen Druckern gedruckt werden (A4 & A3 auf einem Laser, >=A2 auf einem Plotter). Das Script soll auf allen Rechnern in unserer Firma lauffähig sein. Da die Drucker aber nicht überall gleich benannt sind, sollen die Drucker beim Starten des Scriptes vom Benutzer ausgewählt werden. Auf Basis dieser Auswahl wird dann jedesmal im Drucken-Dialog der entsprechende Drucker gewählt.

    Leider scheint die Auswahl des Druckers mit diesem Befehl nicht zu funktionieren, da die Druckernamen verschlüsselt/codiert sind.

    [autoit]

    ControlCommand ("Drucken","","[CLASS:ComboBox; INSTANCE:1]","SelectString", $printerA4)

    [/autoit]

    Gruß
    Stefan

  • hallo MrIcemanF14,

    eine suche " AcroRd32.exe /console" bei google brachte mir z.b. folgendes :)

    [autoit]

    Open a PDF file:
    AcroRd32.exe PdfFile

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

    Open a PDF file in a new instance of Adobe Reader:
    AcroRd32.exe /N PdfFile

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

    Open a PDF file at page 7:
    AcroRd32.exe /A "page=7=OpenActions" PdfFile

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

    Open a PDF file with navigation pane active, zoom out to 50%, and search for and highlight the word "batch":
    AcroRd32.exe /A "zoom=50&navpanes=1=OpenActions&search=batch" PdfFile

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

    Print a PDF file with dialog:
    AcroRd32.exe /P PdfFile

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

    Print a PDF file silently:
    AcroRd32.exe /N /T PdfFile PrinterName [ PrinterDriver [ PrinterPort ] ]

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

    The last command will open a new Adobe Reader window, print the PDF file and then terminate its window unless that window happens to be the only Adobe Reader window left: at least one Adobe Reader window will be left open.

    [/autoit]

    daraus kannst du ja dann was mit autoit bauen ...

    Beispiele:

    [autoit]

    druckt auf dem Standarddrucker
    "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /N /T C:\test.pdf"

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

    druckt auf einem lokalen drucker
    "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /N /T C:\test.pdf "Microsoft XPS Document Writer" ; habe leider nur den Microsoft XPS Document Writer zum testen ...

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

    druckt auf einem Netzwerkdrucker
    "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /N /T C:\test.pdf \\printservername\druckerfreigabename

    [/autoit]

    woher weißt du denn, welche datei auf welchen drucker gesendet werden sol, wie liest du das format aus ?

    gruß gmmg

    3 Mal editiert, zuletzt von gmmg (11. Februar 2014 um 14:19)

  • woher weißt du denn, welche datei auf welchen drucker gesendet werden sol, wie liest du das format aus ?

    Der Nutzer wählt beim Start des Scriptes ein Excel-File aus in dem eine Liste an Zeichnungsnummern steht. Aus dieser Nummer bastel ich mir den Dateinamen zusammen. Mit Hilfe einer pdfinfo.exe lese ich das Seitenformat aus und wähle danach den Drucker aus.

    Das muss ich mir mal in Ruhe anschauen. Auf den ersten Blick sehe ich keine Möglichkeiten die Optionen für den Druck einzustellen (Skalierung, Hoch-/Querformat, etc.). Aber da gibt es sicher auch möglichkeiten. Der Druckauftrag im Hintergrund wäre echt ne elegante Lösung. Danke für den Tipp.

    Gruß
    Stefan

  • ok ...

    das sollte doch kein problem sein, wenn du weißt, welche datei welches druckformat bekommen soll!

    ich würde das in etwa so machen!

    dateien in ein array einlesen und automatisch an die pdfinfo.exe als parameter übergeben! kann die pdfinfo das?
    hab es eben mit pdftk.exe gemacht, da kann man einen dumperstellen ...

    "C:\Program Files (x86)\PDFtk\bin\pdftk.exe" C:\test.pdf dump_data >d:\dump.txt

    hier die seitengröße auslesen und auswerten ...
    wenn du dann die seitengröße weißt, einfach an den entsprechenden drucker senden!

    du kannst auch die drucker doppelt anlegen, musst dann nur im druckermenü die eigenschaften anders definieren ...
    drucker1 -> standardausgabefach 1
    drucker1 -> standardausgabefach 2
    drucker1 -> standardausgabefach 1 /Farbe
    drucker1 -> standardausgabefach 1 /SW

    eventuell hilft das ja :)

    gruß gmmg
    drucker1 -> standardausgabefach 2

  • du kannst auch die drucker doppelt anlegen, musst dann nur im druckermenü die eigenschaften anders definieren ...

    Da bin ich aber wieder bei einem hohen administrativen Aufwand, wenn das Script bei allen Kollegen funktionieren soll. Da müsste man schon fast ein extra Script schreiben, dass die Einrichtung der Drucker überprüft bzw. durchführt. Wie es aussieht kann auch der Foxit Reader keine "detaillierten" Optionen über die Kommandozeile verarbeiten.

    Bleibt also der Weg über die GUI mit dem Problem der merkwürdigen Zeichen.

    dateien in ein array einlesen und automatisch an die pdfinfo.exe als parameter übergeben! kann die pdfinfo das?
    hab es eben mit pdftk.exe gemacht, da kann man einen dumperstellen ...


    ... das kann die pdfinfo auch:

    [autoit]


    Local $iPID = Run(@ScriptDir & '\Resources\pdfinfo.exe "' & $pdfFile & '"', "", @SW_HIDE, $STDOUT_CHILD)

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

    ; Wait until the process has closed using the PID returned by Run.
    ProcessWaitClose($iPID)

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

    ; Read the Stdout stream of the PID returned by Run. This can also be done in a while loop. Look at the example for StderrRead.
    Local $sOutput = StdoutRead($iPID)

    [/autoit]

    Gruß
    Stefan

  • ihr habt wohl keinen printserver, auf dem du das einrichten kannst ?
    bei lokalen druckern wird das natürlich schwierig!

    eventuell mal schauen, wo der drucker seine einstellungen speichert, wenn das in der registry passiert, brauchst ja nur da die parameter zu ändern!

    gruß gmmg