Event kann nicht ausgelesen werden

  • Hallo zusammen,


    ich hatte mir ein kleines Skrip mit Autoit geschrieben, dass mir einfache, immer wiederkehrende Befehle mit dem PC-Namen als Parameter ausführt. Das hat gut funktioniert, bis ich mir die aktuelle Version V3.2.10.0 installiert habe.
    Das Problem ist, dass das Händling mit dem Befehl GUICtrlCreateList jetzt anders funktioniert.

    Ich habe mein Skript entsprechend umgeschrieben, aber leider wird jetzt nicht mehr erkannt, wenn ich einen Eintrag im Listview auswähle.
    Ich möchte, das nach einem Kick auf einen Eintrag im ListView der PC-Name in die Inputbox übernommen wird.

    Hier der entsprechende Code.


    Was mache ich falsch? Ich hoffe, jemand kann mir weiterhelfen.


    Gruß

    Häger

  • GUIGetMsg() gibt nur ein Event zurück, wenn du oben auf PC-Name oder Bemerkung klickst, du musst aber das von einem Item abfangen

  • Hallo,


    danke für den Hinweis Leviathan. Ich habe jetzt eine Lösung für das Problem finden können. Es ist aber in meinen Augen trozdem nicht sauber gelöst. Dafür funktioniert es.
    Hier der Code für diejenigen, die auch an der Abfrage zu knabbern haben.
    Was mich stört ist, dass ich die Mausposition eingrenzen muss, um wirklich das Event aus dem ListView zu bekommen. Das war bestimmt nicht so von den AutoIt-Entwicklern so gedacht.



    Gruß

    Häger

    • Offizieller Beitrag

    Es gäbe noch diese Möglichkeit:

    [autoit]


    While 1
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $close
    $pc=GUICtrlRead($inputbox)
    GUIDelete()
    Return $pc
    ; Case $msg[0] = -7 And $msg[3] > 12 And $msg[3] < 390 And $msg[4] > 32 And $msg[4] < 307
    ; GUICtrlSetData($inputbox, $listboxtext[_GUICtrlListView_SetSelectionMark ($hListView,1)][0])
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $GUI
    ExitLoop
    EndSelect
    If _GUICtrlListView_GetSelectedIndices($hListView) <> '' Then
    GUICtrlSetData($inputbox, $listboxtext[_GUICtrlListView_SetSelectionMark ($hListView,1)][0])
    ControlListView("Bitte PC auswählen", '', $hListView, 'SelectClear')
    EndIf
    WEnd

    [/autoit]

    Aber richtig überzeugend ist die auch nicht. :wacko:

    • Offizieller Beitrag

    Ich denke, du suchst sowas:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GUIListView.au3>

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

    $gui = GUICreate('test')
    $lv = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200)
    For $i = 1 To 10
    GUICtrlCreateListViewItem('Zeile ' & $i & 'Spalte 1|Zeile ' & $i & 'Spalte 2', $lv)
    Next
    GUISetState()
    GUIRegisterMsg($WM_NOTIFY, "MY_WM_COMMAND")

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

    Do
    $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE

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

    Func ListView1Click()
    Local $item = _GUICtrlListView_GetItemTextArray($lv)
    MsgBox(0, '', 'Text in Spalte 2: ' & $item[2])
    EndFunc

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

    Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $tagNMHDR, $event
    Switch $wParam
    Case $lv ; ListView-ID
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Switch $event
    Case $NM_CLICK
    ListView1Click()
    Case $NM_DBLCLK
    ;~ ListView1DoubleClick()
    Case $NM_RCLICK
    ;~ ListView1RightClick()
    Case $NM_RDBLCLK
    ;~ ListView1RightDoubleClick()
    Case $NM_LDOWN
    ;~ ListView1LeftDown()
    Case $NM_RDOWN
    ;~ ListView1RightDown()
    EndSwitch
    EndSwitch
    $tagNMHDR = 0
    EndFunc

    [/autoit]

    Edit:
    Ich hab jetzt mal die Funktion 'WM_NOTIFY' aus der aktuellen Version verwendet und die auswertbaren Parameter in ein Array gepackt, dass an die Funktion übergeben werden kann.
    Bietet jetzt viel mehr Möglichkeiten als noch die alte Version.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GUIListView.au3>

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

    $gui = GUICreate('test')
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200)
    For $i = 1 To 10
    GUICtrlCreateListViewItem('Zeile ' & $i & 'Spalte 1|Zeile ' & $i & 'Spalte 2', $hListView)
    Next
    GUISetState()
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    Do
    $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE

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

    Func _LeftClick($Info)
    MsgBox(0, 'Text in Spalte', _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]) )
    EndFunc

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $LVN_COLUMNCLICK ; A column was clicked
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    Local $aInfo[11] = [$hWndFrom, _
    $iIDFrom, _
    $iCode, _
    DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem"), _
    DllStructGetData($tInfo, "NewState"), _
    DllStructGetData($tInfo, "OldState"), _
    DllStructGetData($tInfo, "Changed"), _
    DllStructGetData($tInfo, "ActionX"), _
    DllStructGetData($tInfo, "ActionY"), _
    DllStructGetData($tInfo, "Param")]
    ;~ _ColumnClick($aInfo)
    Case $LVN_DELETEITEM ; An item is about to be deleted
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    Local $aInfo[11] = [$hWndFrom, _
    $iIDFrom, _
    $iCode, _
    DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem"), _
    DllStructGetData($tInfo, "NewState"), _
    DllStructGetData($tInfo, "OldState"), _
    DllStructGetData($tInfo, "Changed"), _
    DllStructGetData($tInfo, "ActionX"), _
    DllStructGetData($tInfo, "ActionY"), _
    DllStructGetData($tInfo, "Param")]
    ;~ _ItemDeleted($aInfo)
    Case $LVN_HOTTRACK ; Sent by a list-view control when the user moves the mouse over an item
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    Local $aInfo[11] = [$hWndFrom, _
    $iIDFrom, _
    $iCode, _
    DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem"), _
    DllStructGetData($tInfo, "NewState"), _
    DllStructGetData($tInfo, "OldState"), _
    DllStructGetData($tInfo, "Changed"), _
    DllStructGetData($tInfo, "ActionX"), _
    DllStructGetData($tInfo, "ActionY"), _
    DllStructGetData($tInfo, "Param")]
    Return 0 ; allow the list view to perform its normal track select processing.
    ;Return 1 ; the item will not be selected.
    ;~ _HottTrackItem($aInfo)
    Case $LVN_KEYDOWN ; A key has been pressed
    Local $tInfo = DllStructCreate($tagNMLVKEYDOWN, $ilParam)
    Local $aInfo[5] = [$hWndFrom, _
    $iIDFrom, _
    $iCode, _
    DllStructGetData($tInfo, "VKey"), _
    DllStructGetData($tInfo, "KeyFlags")]
    ;~ _KeyDown($aInfo)
    Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $aInfo[12] = [$hWndFrom, _
    $iIDFrom, _
    $iCode, _
    DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem"), _
    DllStructGetData($tInfo, "NewState"), _
    DllStructGetData($tInfo, "OldState"), _
    DllStructGetData($tInfo, "Changed"), _
    DllStructGetData($tInfo, "ActionX"), _
    DllStructGetData($tInfo, "ActionY"), _
    DllStructGetData($tInfo, "lParam"), _
    DllStructGetData($tInfo, "KeyFlags")]
    _LeftClick($aInfo)
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $aInfo[12] = [$hWndFrom, _
    $iIDFrom, _
    $iCode, _
    DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem"), _
    DllStructGetData($tInfo, "NewState"), _
    DllStructGetData($tInfo, "OldState"), _
    DllStructGetData($tInfo, "Changed"), _
    DllStructGetData($tInfo, "ActionX"), _
    DllStructGetData($tInfo, "ActionY"), _
    DllStructGetData($tInfo, "lParam"), _
    DllStructGetData($tInfo, "KeyFlags")]
    ;~ _LeftDblClick($aInfo)
    Case $NM_KILLFOCUS ; The control has lost the input focus
    Local $aInfo[3] = [$hWndFrom, _
    $iIDFrom, _
    $iCode]
    ;~ _LostFocus($aInfo)
    Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $aInfo[12] = [$hWndFrom, _
    $iIDFrom, _
    $iCode, _
    DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem"), _
    DllStructGetData($tInfo, "NewState"), _
    DllStructGetData($tInfo, "OldState"), _
    DllStructGetData($tInfo, "Changed"), _
    DllStructGetData($tInfo, "ActionX"), _
    DllStructGetData($tInfo, "ActionY"), _
    DllStructGetData($tInfo, "lParam"), _
    DllStructGetData($tInfo, "KeyFlags")]
    ; Return 1 ; not to allow the default processing
    Return 0 ; allow the default processing
    ;~ _RightClick($aInfo)
    Case $NM_RDBLCLK ; Sent by a list-view control when the user double-clicks an item with the right mouse button
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $aInfo[12] = [$hWndFrom, _
    $iIDFrom, _
    $iCode, _
    DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem"), _
    DllStructGetData($tInfo, "NewState"), _
    DllStructGetData($tInfo, "OldState"), _
    DllStructGetData($tInfo, "Changed"), _
    DllStructGetData($tInfo, "ActionX"), _
    DllStructGetData($tInfo, "ActionY"), _
    DllStructGetData($tInfo, "lParam"), _
    DllStructGetData($tInfo, "KeyFlags")]
    ;~ _RightDblClick($aInfo)
    Case $NM_RETURN ; The control has the input focus and that the user has pressed the ENTER key
    Local $aInfo[3] = [$hWndFrom, _
    $iIDFrom, _
    $iCode]
    ;~ _InputFocusReturn($aInfo)
    Case $NM_SETFOCUS ; The control has received the input focus
    Local $aInfo[3] = [$hWndFrom, _
    $iIDFrom, _
    $iCode]
    ;~ _SetFocus($aInfo)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]