$WM_NOTIFY, TVN_SELCHANGEDW in TreeView meldet bei Mausclick zweimal

  • Hi,

    Ich verwende die WM_NOTIFY message "TVN_SELCHANGEDW" um bei Änderung eines TreeView-Items eine beliebige Aktion durchzuführen. In meinem Beispiel eine MsgBox.
    Das Problem: Wird das Item mittels Tasteneingaben geändert, erscheint die MsgBox einmal. Wird das Item mittels linker Maustaste verändert, erscheint die MsgBox zweimal.

    Wie kann ich diese doppelte Ausführung verhindern?
    Danke schonmal für Eure Vorschläge.

    folgender Code:

  • Was passiert:

    Ein Druck auf der Tastatur wechselt sofort das "selektierte" Element.

    Ein Klick mit der Maus löst das Element zu recht zwei Mal aus: Einmal, weil die Selection auf "null" wechselt, und danach, weil die Selection auf das angeklickte Item wechselt. Wenn du während der Messageboxen hinguckst, siehst du es. ;)

    Um den "Fehler" zu verhindern bleiben dir zwei Möglichkeiten. Mit anderen Events arbeiten, oder abfangen, ob derzeit überhaupt ein Element markiert ist. Ein Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <listviewconstants.au3>
    #include <GUITreeView.au3>
    #Region - GUI Create
    GUICreate('treeview', 550, 400)
    $TreeView1 = GUICtrlCreateTreeView(10, 10, 200, 380)
    $hTreeView = GUICtrlGetHandle($TreeView1)
    $item1 = GUICtrlCreateTreeViewItem("Root Item 1", $TreeView1)
    $item2 = GUICtrlCreateTreeViewItem("Root Item 2", $TreeView1)
    For $i = 1 To 10
    GUICtrlCreateTreeViewItem("Child Item " & $i, $item1)
    GUICtrlCreateTreeViewItem("Child Item " & $i, $item2)
    Next
    $ListView1 = GUICtrlCreateListView("test|test", 220, 10, 320, 380)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 150)
    For $i = 1 To 50
    GUICtrlCreateListViewItem("List Item" & $i & "|List Item " & $i & " Column 2", $ListView1)
    Next
    GUISetState()
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    #EndRegion - GUI Create
    #Region - GUI SelectLoop
    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd
    Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $tNMHDR, $IdFrom, $iCode
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $IdFrom = DllStructGetData($tNMHDR, "IdFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hTreeView
    Switch $iCode
    Case $TVN_SELCHANGEDW ; <---------------
    If _GUICtrlTreeView_GetSelection($TreeView1) <> 0 Then
    MsgBox($MB_SYSTEMMODAL, "", "changed")
    EndIf
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.