Doppelklick in Listview auswerten

  • [BugFix: verschoben aus Skripte]

    Hey,

    wäre es möglich die Funktion auf einen Doppelklick zu erweitern?
    z.B. bei Programmen mit Listview wäre das ziemlich gut. Links markieren, rechts das Kontextmenü und per Doppelklick den Eintrag bearbeiten.

    Bei der Funktion blicke ich leider nicht so richtig durch

    Einmal editiert, zuletzt von BugFix (4. März 2009 um 09:25)

    • Offizieller Beitrag

    Hey,

    wäre es möglich die Funktion auf einen Doppelklick zu erweitern?
    z.B. bei Programmen mit Listview wäre das ziemlich gut. Links markieren, rechts das Kontextmenü und per Doppelklick den Eintrag bearbeiten.

    Bei der Funktion blicke ich leider nicht so richtig durch


    Diese Funktion hier ermöglicht es Hotkeys mit Kombination Maustasten zu erstellen. Die Standard Hotkeys erlauben nur die Kombination von Tasten.
    Wie man ListView-Einträge on-the-fly editiert kannst du hier sehen: ListView - Editieren aller SubItems

  • Interessant. Leider bin ich heute etwas schwer von Begriff. Eigentlich suche ich nur eine Möglichkeit um auf einen Doppelklick ins Listview zu reagieren - ich schaus mir aber mal genauer an.

    • Offizieller Beitrag

    Eigentlich suche ich nur eine Möglichkeit um auf einen Doppelklick ins Listview zu reagieren - ich schaus mir aber mal genauer an.

    Hier mal ein Bsp., indem alle Events eines Listview aufgeführt sind. Aktiviert ist hier DblClick.

    Spoiler anzeigen
    [autoit]

    #include<GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    #include <GUIListView.au3>

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

    $gui = GUICreate('test')
    $hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 146)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
    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 _LeftDblClick($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]

    Ich verschiebe deine Fragen mal in den Bereich Hilfe, da es mit dem MouseHotKey ja nix zu tun hat.

  • Okay danke.
    Deine Funktion ist leider etwas "too advanced" für mich.

    Ich habe aber hier im Forum gefunden wonach ich suche:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>

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

    ;Globals für die Funktion:
    Global Const $NM_DBLCLK = -3

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

    $MainGui = GUICreate("DBClick test", 516, 295, 192, 120)
    GUISetBkColor(0x0)

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

    $ListView = GUICtrlCreateListView("Produkt Name", 8, 8, 498, 214)
    $TestItem = GUICtrlCreateListViewItem("TEST1", $ListView)
    $TestItem = GUICtrlCreateListViewItem("TEST2", $ListView)

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

    GUISetState(@SW_SHOW)
    GUIRegisterMsg(0x004E, "_DoubleClickOnListView");Die Funktion wird bei einem Klick auf die GUI aufgerufen!

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _DoubleClickOnListView($hWndGUI, $MsgID, $wParam, $lParam);Die Eigentliche Funktion
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3); Checkt wie das EVENT aussieht
    If $wParam = $ListView Then;Wenn der Klick auf das ListView ging..
    If $event = $NM_DBLCLK Then;.. Wenn es ein DoppelKlick war
    ; Hier kommt hin was er machen soll:
    MsgBox(0, "",GUICtrlRead(GUICtrlRead($ListView)))
    EndIf
    EndIf
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    EndFunc ;==>_DoubleClickOnListView

    [/autoit]

    Komischerweise bekomme ich in meinem Skript (im Beispiel gehts) in der Zeile Global Const $NM_DBLCLK = -3 folgende Fehlermeldung: ERROR: $NM_DBLCLK previously declared as a 'Const'
    Ändere ich die Zeile in: $N_DBLCLK = -3 (in der Funktion natürlich auch) läuft auch mein Skript.
    Das versteh mal einer ...

    • Offizieller Beitrag

    Komischerweise bekomme ich in meinem Skript (im Beispiel gehts) in der Zeile Global Const $NM_DBLCLK = -3 folgende Fehlermeldung: ERROR: $NM_DBLCLK previously declared as a 'Const'
    Ändere ich die Zeile in: $N_DBLCLK = -3 (in der Funktion natürlich auch) läuft auch mein Skript.
    Das versteh mal einer ...


    Diese Fehlermeldung ist völlig korrekt. Die Konstante $NM_DBLCLK ist in den WindowsConstants.au3 deklariert.
    Das von dir verwendete Skript ist im Prinzip, wie meines, nur gekürzt. ;)

  • Achso, na dann wäre das auch geklärt.

    Bei deinem Skript haben mich die vielen Zeilen erschreckt.
    Mit etwas Abstand und einer ungefähren Vorstellung wie die Funktionen arbeiten erkenne ich die Ähnlichkeit.

    P.S. Derzeit versuche ich mich gerade in deine Funktion zum Färben einzelner Listviewitems reinzuarbeiten und stehe dort vor dem gleichen Problem. 8o

  • nuts:

    Das hast du doch schon mal selber in dieses Skript eingebaut: ;)

    Spoiler anzeigen
    [autoit]

    #include <GuiListBox.au3>
    #include <WindowsConstants.au3>

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

    Global $oUml = ObjCreate("Scripting.Dictionary") ; Dank an 'BugFix'
    $oUml.Add('ý', '²')
    $oUml.Add('ü', '³')
    $oUml.Add('õ', '§')
    $oUml.Add('ï', '´')
    $oUml.Add('ø', '°')
    $oUml.Add('?', '€')
    $oUml.Add('æ', 'µ')
    $oUml.Add('”', 'ö')
    $oUml.Add('', 'ü')
    $oUml.Add('„', 'ä')
    $oUml.Add('á', 'ß')
    $oUml.Add('Ž', 'Ä')
    $oUml.Add('™', 'Ö')
    $oUml.Add('š', 'Ü')
    $colKeys = $oUml.Keys

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

    ;~ Local $Ordner = 'C:\Programme'
    Local $Ordner = @DesktopDir
    Global $aOrdner
    HotKeySet("{ENTER}", "_Open_Ordner")

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

    $PID = Run(@ComSpec & " /c " & 'dir "'&$Ordner&'" /ad /b', "", @SW_HIDE, 0x2)
    Local $line
    While 1
    $line &= StdoutRead($PID)
    If @error Then ExitLoop
    Wend
    For $strKey In $colKeys
    If StringInStr($line, $strKey, 1) Then $line = StringReplace($line, $strKey, $oUml.Item($strKey))
    Next
    $aOrdner = StringSplit($line, @CRLF, 3)

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

    Opt('GUIOnEventMode', 1)

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

    $gui = GUICreate('Schnelle Ordnerauswahl by funkey', 400, 600, -1, -1)
    GUISetOnEvent(-3, '_Ende')
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    Global $Input = GUICtrlCreateInput('', 10, 10, 380, 20)
    Global $List = GUICtrlCreateList('', 10, 40, 380, 560)
    Global $hList = GUICtrlGetHandle(-1)

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

    For $i = 0 To UBound($aOrdner) -2
    GUICtrlSetData(-1, $aOrdner[$i])
    Next

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

    GUISetState()

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

    While 1
    Sleep(100000)
    WEnd

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

    Func _Check_Eingabe($iwParam)
    switch $iwParam
    case 0x03000003
    _GUICtrlListBox_SetCurSel($hList, _GUICtrlListBox_FindString($hList, GUICtrlRead($Input)))
    EndSwitch
    EndFunc

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

    Func _Open_Ordner()
    If GUICtrlRead($List) <> "" Then ShellExecute($Ordner & '\' & GUICtrlRead($List))
    EndFunc

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

    Func _Ende()
    Exit
    EndFunc

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    _Check_Eingabe($iwParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndListBox
    If Not IsHWnd($List) Then $hWndListBox = GUICtrlGetHandle($List)
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16) ; Hi Word
    Switch $hWndFrom
    Case $List, $hWndListBox
    Switch $iCode
    Case $LBN_DBLCLK
    _Open_Ordner()
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND (Bugfix - http://www.autoit.de)

    [/autoit]
  • Also kein WM_Notify mehr im Listview bei Autoitversionen >3.3.0.0? Kann das jemand bestätigen?

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    ;Globals für die Funktion:

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

    $MainGui = GUICreate("DBClick test", 616, 395, 192, 120)
    ;GUISetBkColor(0x0)

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

    $ListView = GUICtrlCreateListView("Produkt Name", 8, 8, 498, 214);Das ListView mit $LVS_LIST...
    $TestItem = GUICtrlCreateListViewItem("TEST1", $ListView);Test 1
    $TestItem = GUICtrlCreateListViewItem("TEST2", $ListView);Test 2

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

    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_notify, "_DoubleClickOnListView");Die Funktion wird bei einem Klick auf die GUI aufgerufen!

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _DoubleClickOnListView($hWndGUI, $MsgID, $wParam, $lParam);Die Eigentliche Funktion
    Local $tagNMHDR, $event, $hwndFrom, $code
    ConsoleWrite( $hWndGUI& @CRLF& $MsgID& @CRLF& $wParam& @CRLF& $lParam& @CRLF)
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3); Checkt wie das EVENT aussieht
    If $wParam = $ListView Then;Wenn der Klick auf das ListView ging..
    If $event = $NM_DBLCLK Then;.. Wenn es ein DoppelKlick war
    ; Hier kommt hin was er machen soll:
    MsgBox(0, "",GUICtrlRead(GUICtrlRead($ListView)))
    EndIf
    EndIf
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    EndFunc ;==>_DoubleClickOnListView

    [/autoit]


    Gar nichts zu sehn?

    • Offizieller Beitrag

    Funktioniert auch einwandfrei unter Win7 Ultimate 32 und 64. Sowohl Autoit 3.3.0 , als auch in der Autoit Beta.