Doppelklick auf runter gescrollte Listbox wird nicht erkannt

  • Abend zusammen

    Ich habe eine Listbox, das Problem ist das mein Doppelklick nicht erkannt wird.
    Wie ich den Doppelklick abfange:

    Spoiler anzeigen
    [autoit]

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ;Klick abfangen

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndHandel, $hWndPN
    If Not IsHWnd($List_Handel) Then $hWndHandel = GUICtrlGetHandle($List_Handel) ;Handel von Liste_Handel
    If Not IsHWnd($List_PN) Then $hWndPN = GUICtrlGetHandle($List_PN) ;Handel von Liste_PN
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16) ; Hi Word
    Switch $hWndFrom
    Case $List_Handel,$hWndHandel ;In der Liste_Handel geklickt
    Switch $iCode
    Case $LBN_DBLCLK ;Falls Doppelklick
    $Clicked_Item_Handel =_GUICtrlListBox_GetText($List_Handel,_GUICtrlListBox_GetCurSel($List_Handel)) ;Text von Angeklicktem Item auslesen
    _Textbausteine_GetText($Clicked_Item_Handel,"Handel") ;Text aus der Ini Datei holen zum Angeklicktem Text
    EndSwitch
    Case $List_PN,$hWndPN ;In der Liste_PN geklickt
    Switch $iCode
    Case $LBN_DBLCLK ;Falls Doppelklick
    $Clicked_Item_PN =_GUICtrlListBox_GetText($List_PN,_GUICtrlListBox_GetCurSel($List_PN)) ;Text von Angeklicktem Item auslesen
    _Textbausteine_GetText($Clicked_Item_PN,"PN") ;Text aus der Ini Datei holen zum Angeklicktem Text
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]

    Das ganze funktioniert auch einwandfrei, ausser ich Scrolle mit dem Scrollbalken auf der rechten Seite der Listbox nach unten, dann wird der Doppelklick nicht mehr erkannt.
    Wie kann ich das Problem beheben?
    Falls ihr noch Infos braucht einfach Posten ;)

    Danke im Voraus

    LG, Fabian

    Einmal editiert, zuletzt von Fabian (8. Mai 2010 um 15:15)

    • Offizieller Beitrag

    Poste mal ein funtionsfähiges Beispiel. Mit dem Codeschnipsel ist das: Rate mal mit Rosenthal.

  • Mein ganzer Code:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiListBox.au3>
    #include <Constants.au3>

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

    HotKeySet("^!{y}","_MinimizeToTray")

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

    Opt("TrayMenuMode",1) ; Standard Traymenüeinträge (Skript pausieren/beenden) werden nicht angezeigt.
    Opt("TrayOnEventMode",1) ;Aktiviert die OnEvent Funktionsanmeldung für das Tray

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

    Global $Textbausteine_Pfad=@ScriptDir& "\Textbausteine.ini" ;Pfad zur Ini Datei
    Global $font="Times New Roman",$size=8.5,$weight=100

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

    $Fenster = GUICreate("Textbausteine",300,220) ;Grafische Ansicht
    GUISetFont ($size,$weight,0,$font,$Fenster)
    $Group_Handel = GUICtrlCreateGroup("Handel",10,5,140,200)
    $Group_PN = GUICtrlCreateGroup("PN",150,5,140,200)
    $List_Handel = GUICtrlCreateList("",20,20,120,180)
    $List_PN = GUICtrlCreateList("",160,20,120,180)
    $Label_Copyright = GUICtrlCreateLabel("® by Fabian",110,205)
    GUICtrlSetFont($Label_Copyright,8.5,100,0,"Times New Roman")
    GUISetState(@SW_SHOW,$Fenster)

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

    TraySetIcon("Test.ico") ;TrayIcon festlegen
    GUISetIcon("Test.ico",-1,$Fenster) ;GuiIcon festlegen
    $Tray_State = TrayCreateItem("Minimize To Tray") ;Trayitem erstellen
    TrayItemSetOnEvent($Tray_State,"_MinimizeToTray") ;Wenn Item gedrückt dann Funktion aufrufen

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ;Klick abfangen
    _Textbausteine_Load() ;Alle Textbausteine in List laden

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

    While 1
    $msg = GUIGetMsg()

    Switch $msg
    Case $GUI_EVENT_CLOSE ;Fenster schliessen
    Exit
    EndSwitch
    Sleep(10) ;Prozessorauslastung gering halten
    WEnd

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

    Func _Textbausteine_Load()
    Local $Textbausteine_Handel,$Textbausteine_PN
    $Textbausteine_Handel = IniReadSection($Textbausteine_Pfad,"Handel") ;[x][0] Bezeichnung // [x][1] Text
    $Textbausteine_PN = IniReadSection($Textbausteine_Pfad,"PN") ;[x][0] Bezeichnung // [x][1] Text
    For $Index = 1 To UBound($Textbausteine_Handel)-1
    ;GUICtrlSetData($List_Handel,$Textbausteine_Handel[$Index][0]&"|") ;Jeden Eintrag aus Ini Datei in List einfügen
    GUICtrlSetData($List_Handel,Stringleft($Textbausteine_Handel[$Index][0],18)&"|") ;Anzeige auf 18 Zeichen beschränken
    Next
    For $Index = 1 To UBound($Textbausteine_PN)-1
    ;GUICtrlSetData($List_PN,$Textbausteine_PN[$Index][0]&"|") ;Jeden Eintrag aus Ini Datei in List einfügen
    GUICtrlSetData($List_PN,Stringleft($Textbausteine_PN[$Index][0],18)&"|") ;Anzeige auf 18 Zeichen beschränken
    Next
    EndFunc ;==>_Textbausteine_Load

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

    Func _Textbausteine_GetText($Key,$Section)
    Local $Clicked_Text

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

    $Clicked_Text = IniRead($Textbausteine_Pfad,$Section,$Key,"error") ;Text aus Inidatei lesen
    $Clicked_Text = StringReplace($Clicked_Text,"[CRLF]",@CRLF)
    If $Clicked_Text <> "error" Then ;Falls Erfolgreich ausgelesen
    ClipPut($Clicked_Text) ;Text in Zwischenablage schreiben
    EndIf
    EndFunc ;==>_Textbausteine_GetText

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndHandel, $hWndPN
    If Not IsHWnd($List_Handel) Then $hWndHandel = GUICtrlGetHandle($List_Handel) ;Handel von Liste_Handel
    If Not IsHWnd($List_PN) Then $hWndPN = GUICtrlGetHandle($List_PN) ;Handel von Liste_PN
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16) ; Hi Word
    Switch $hWndFrom
    Case $List_Handel,$hWndHandel ;In der Liste_Handel geklickt
    Switch $iCode
    Case $LBN_DBLCLK ;Falls Doppelklick
    $Clicked_Item_Handel =_GUICtrlListBox_GetText($List_Handel,_GUICtrlListBox_GetCurSel($List_Handel)) ;Text von Angeklicktem Item auslesen
    _Textbausteine_GetText($Clicked_Item_Handel,"Handel") ;Text aus der Ini Datei holen zum Angeklicktem Text
    EndSwitch
    Case $List_PN,$hWndPN ;In der Liste_PN geklickt
    Switch $iCode
    Case $LBN_DBLCLK ;Falls Doppelklick
    $Clicked_Item_PN =_GUICtrlListBox_GetText($List_PN,_GUICtrlListBox_GetCurSel($List_PN)) ;Text von Angeklicktem Item auslesen
    _Textbausteine_GetText($Clicked_Item_PN,"PN") ;Text aus der Ini Datei holen zum Angeklicktem Text
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    Func _MinimizeToTray()
    TrayItemSetState($Tray_State,$TRAY_UNCHECKED) ;Markierung des Trayeintrages entfernen
    TrayItemSetText($Tray_State,"Restore") ;Text wechseln
    TrayItemSetOnEvent ( $Tray_State,"_Restore") ;Wenn Item gedrückt dann Funktion aufrufen
    GUISetState(@SW_HIDE, $Fenster) ;Fenster verstecken
    HotKeySet("^!{y}","_Restore")
    EndFunc ;==>_MinimizeToTray

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

    Func _Restore()
    Local $Pos
    TrayItemSetState($Tray_State,$TRAY_UNCHECKED) ;Markierung des Trayeintrages entfernen
    TrayItemSetText($Tray_State,"Minimize To Tray") ;Text wechseln
    TrayItemSetOnEvent ( $Tray_State,"_MinimizeToTray") ;Wenn Item gedrückt dann Funktion aufrufen
    $Pos = MouseGetPos()
    WinMove("Wartower.de Textbausteine","",$Pos[0]+20,$Pos[1])
    GUISetState(@SW_SHOW, $Fenster) ;Fenster zeigen
    GUISetState(@SW_RESTORE,$Fenster) ;Fenster wieder herstellen von Tray
    HotKeySet("^!{y}","_MinimizeToTray")
    EndFunc ;==>_Restore

    [/autoit]
    • Offizieller Beitrag

    Wenn du jetz noch eine Ini Datei mitpostest kann man auch testen. Oder soll ich mir die selbst erstellen?

  • Moin,

    Wenn du jetz noch eine Ini Datei mitpostest kann man auch testen. Oder soll ich mir die selbst erstellen?

    Hat sich erledigt.
    Der Doppelklick wurde erkannt, aber da ich die Textanzeige in der Listbox auf 18 beschränkt habe, wurde der angeklickte Text der über 18 Zeichen war nicht mehr gefunden in der Ini Datei.

    Trotzdem Danke
    Lg, Fabian