Per AutoIt Windows Form : Combobox komplett auslesen

  • Hey Leute. Ich versuche seit gestern in einer Windows Form die komplette ComboBox auszulesen. Aber ich kriege immer nur den Wert der gerade angezeigt wird.

    Hier mal ein Beispiel:

    [Blockierte Grafik: http://img5.fotos-hochladen.net/uploads/unbenanntazxeqnuimb.png]


    Was ich bisher ausprobiert habe:

    [autoit]

    $string = ControlGetText("Device Selection","", "[CLASS:ComboBox; INSTANCE:2]")
    MsgBox(0, "mBot Reader", "Ausgelesen: "&@crlf&@CRLF&$string)

    [/autoit]

    Hat da vieleicht wer n Tipp für mich?

    Gruss: Sonic

    Status: Scripting Blitz

    Der soll mich erstmal kriegen

    Zitat von Angelo_Merte

    du warst eine sekunde schneller als ich


    Sobald ein Optimist ein Licht erblickt, das es gar nicht gibt, findet sich ein Pessimist, der es wieder ausbläst.

    • Offizieller Beitrag

    Die Liste mit den Einträgen ist ein Child der Combo, so in etwa sollte das mgl. sein:
    - Handle der Combo holen
    - Enumerate Windows dafür durchführen um das Child-Handle zu bekommen (du müsstest zwei Childs finden: Input und Liste)
    - mit dem Child-Handle kannst du den Listeninhalt abfragen

  • Ich hoffe dass ich so den Handle der Combobox korrekt hole

    [autoit]

    WinWaitActive('Device Selection')
    $hWnd = WinGetHandle('Device Selection')

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

    Local $hControl = ControlGetHandle($hWnd, "", "[CLASS:ComboBox; INSTANCE:2]")

    [/autoit]

    Nur was du mit "Emulate Windows" meinst weis ich nicht. Und wie genau frage ich den Listinhalt des Handles ab?? 8|

    Gruss: Sonic

    Status: Scripting Blitz

    Der soll mich erstmal kriegen

    Zitat von Angelo_Merte

    du warst eine sekunde schneller als ich


    Sobald ein Optimist ein Licht erblickt, das es gar nicht gibt, findet sich ein Pessimist, der es wieder ausbläst.

    • Offizieller Beitrag

    Nein - nicht Emulate sondern Enumerate (Aufzählen). ;)

    Aber es geht besser mit einem Dll-Call für GetComboboxInfo.
    (Falls der Code nicht richtig dargestellt wird - folgende Includes brauchst du:
    <GuiComboBoxEx.au3>
    <GUIConstantsEx.au3>
    <GuiListBox.au3> )

    Spoiler anzeigen
    [autoit]


    #include <GuiComboBoxEx.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListBox.au3>

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

    Example()

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

    Func Example()
    ; create structure to receive combobox infos
    Local $tagCOMBOBOXINFO = 'struct;dword cbSize;int[4];int[4];dword stateButton;hwnd hwndCombo;hwnd hwndItem;hwnd hwndList;endstruct'
    Local $tCOMBOBOXINFO = DllStructCreate($tagCOMBOBOXINFO)
    DllStructSetData($tCOMBOBOXINFO, 'cbSize', DllStructGetSize($tCOMBOBOXINFO))
    Local $pCOMBOBOXINFO = DllStructGetPtr($tCOMBOBOXINFO)

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

    Local $hGUI, $hCombo

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

    ; Create GUI
    $hGUI = GUICreate("ComboBoxEx Get ComboBox Info", 400, 300)
    $cCombo = GUICtrlCreateCombo('', 10, 10, 200, 22)
    $hCombo = GUICtrlGetHandle($cCombo)
    GUISetState(@SW_SHOW)

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

    ; Add values
    GUICtrlSetData($cCombo, 'Eins|Zwei|Drei|Vier|Fünf', 'Eins')

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

    ; ask for Combobox Info
    $aRet = DllCall('user32.dll', 'int', 'GetComboBoxInfo', 'hwnd', $hCombo, 'ptr', $pCOMBOBOXINFO)
    If Not @error Then
    $hList = DllStructGetData($tCOMBOBOXINFO, "hwndList")
    $iCount = _GUICtrlListBox_GetCount($hList)
    For $i = 0 To $iCount -1
    ConsoleWrite('DropdownList Item-' & $i+1 & ' : ' & _GUICtrlListBox_GetText($hList, $i) & @CRLF)
    Next
    EndIf
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

    [/autoit]


    In Zeile 33 taucht ein überzähliges ; auf. Der Syntaxhighlighter ist hier noch nicht ganz auf dem Laufenden... ;)
    So ist es korrekt: ConsoleWrite('DropdownList Item-' & $i+1 & ' : ' & _GUICtrlListBox_GetText($hList, $i) & @CRLF)

    EDIT:
    So - das war jetzt die schwierige Variante. Ich konnte mich aber erinnern, dass es irgendeine fertige Func in den UDF geben muss. Nun gefunden:

    Spoiler anzeigen
    [autoit]


    #include <GuiComboBoxEx.au3>
    #include <GUIConstantsEx.au3>

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

    Example1()

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

    Func Example1()
    Local $hGUI, $hCombo

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

    ; Create GUI
    $hGUI = GUICreate("ComboBoxEx Get ComboBox Info", 400, 300)
    $cCombo = GUICtrlCreateCombo('', 10, 10, 200, 22)
    $hCombo = GUICtrlGetHandle($cCombo)
    GUISetState(@SW_SHOW)

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

    ; Add values
    GUICtrlSetData($cCombo, 'Eins|Zwei|Drei|Vier|Fünf', 'Eins')

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

    $sItem = _GUICtrlComboBoxEx_GetList($hCombo)
    ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $sItem --> " & $sItem & @LF)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

    [/autoit]
  • Echt Klasse funktioniert ^^

    Ich habe hier die fertige Funktion für diejenigen die das selbe Problem in Zukunft antreffen:

    Spoiler anzeigen
    [autoit]

    #include <guicomboboxex.au3>
    #include <guiconstantsex.au3>
    #include <guilistbox.au3>

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

    $hList=GetComboBoxData($hCombos)
    $iCount = _GUICtrlListBox_GetCount($hList)
    For $i = 0 To $iCount -1
    ConsoleWrite('DropdownList Item-' & $i+1 & ' : ' & _GUICtrlListBox_GetText($hList, $i) & @CRLF)
    Next
    exit

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

    Func GetComboBoxData($fhCombo)
    ; create structure to receive combobox infos
    Local $tagCOMBOBOXINFO = 'struct;dword cbSize;int[4];int[4];dword stateButton;hwnd hwndCombo;hwnd hwndItem;hwnd hwndList;endstruct'
    Local $tCOMBOBOXINFO = DllStructCreate($tagCOMBOBOXINFO)
    DllStructSetData($tCOMBOBOXINFO, 'cbSize', DllStructGetSize($tCOMBOBOXINFO))
    Local $pCOMBOBOXINFO = DllStructGetPtr($tCOMBOBOXINFO)

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

    ; ask for Combobox Info
    $aRet = DllCall('user32.dll', 'int', 'GetComboBoxInfo', 'hwnd', $fhCombo, 'ptr', $pCOMBOBOXINFO)
    If Not @error Then
    $hList = DllStructGetData($tCOMBOBOXINFO, "hwndList")
    Else
    MsgBox(16, "DLL not found", 'Die DLL "user32.dll" konnte nicht gefunden werden')
    EndIf
    Return $hList
    EndFunc

    [/autoit]

    Danke :thumbup:

    PS: Zeile 9 wäre so korrekt:
    ConsoleWrite('DropdownList Item-' & $i+1 & ' : ' & _GUICtrlListBox_GetText($hList, $i) & @CRLF)

    //EDIT

    Habe erst jetzt die einfachere Variante von dir gesehen. Wie heißt es so schön? Man sieht den Wald vor lauter Bäumen nicht :P

    Gruss: Sonic

    Status: Scripting Blitz

    Der soll mich erstmal kriegen

    Zitat von Angelo_Merte

    du warst eine sekunde schneller als ich


    Sobald ein Optimist ein Licht erblickt, das es gar nicht gibt, findet sich ein Pessimist, der es wieder ausbläst.

    4 Mal editiert, zuletzt von Sonic Hedgehog (17. Oktober 2014 um 00:24)