Click und MouseDown Ereignisse

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Click und MouseDown Ereignisse

    Hi,

    ich habe mir eine Art zusätzliche Task Bar geschrieben. Diese Task Bar enthält eine LIste von Icons, nennen wir sie lvTaskbar

    Ich möchte nun folgendes erreichen:

    Mouse Linksclick:

    1. Wenn ein Icon mit der linken Maustaste angeklickt wird, dann soll das zugehörige Programm gestartet werden. und die Taskleiste wird beendet.

    2. Wenn der Linksclick aber kein Icon trifft, dann soll einfach nichts passieren.

    Mouse Rechtsclick:

    3. Wenn ein Icon mit der rechten Maustaste angeklickt wird, dann soll der Name des Icons angezeigt werden.

    4. Wenn der Rechtsclick kein Icon trifft, dann soll die Taskleiste beendet werden.

    Das habe ich wie folgt versucht:

    VB.NET-Quellcode

    1. Private Sub lvTaskBar_Click(sender As Object, e As System.EventArgs) Handles lvTaskBar.Click
    2. Dim i As Integer = lvTaskBar.SelectedIndices(0)
    3. Debug.Print("i=" & i.ToString)
    4. Dim myProgram As String = lvTaskBar.SelectedItems(0).SubItems(1).Text
    5. Try
    6. Process.Start(myProgram)
    7. Catch ex As Exception
    8. MessageBox.Show("Cannot start " & myProgram & newline2 & ex.Message)
    9. End Try
    10. Me.Close()
    11. End Sub
    12. Private Sub lvTaskBar_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles lvTaskBar.MouseDown
    13. If e.Button = MouseButtons.Right Then
    14. Dim j As Integer = lvTaskBar.SelectedIndices.Count
    15. Debug.Print("j=" & j.ToString)
    16. If j = 0 Then
    17. Me.Close()
    18. Else
    19. MessageBox.Show(Path.GetFileName(lvTaskBar.SelectedItems(0).SubItems(1).Text))
    20. End If
    21. End If
    22. End Sub


    Punkt 1 und 2 funktionieren damit.

    Aber die Sache mit der rechten Maustaste klappt nicht. Der Click der rechten Maustaste selektiert keine Auswahl ... mit anderen Worten ein Klick mit der rechten Maustaste wird immer die Anwendung beenden, egal wohin der Rechtsklick zeigt.

    Was mache ich denn falsch ? Wie kann ich erreichen dass der Rechtsklick das Icon auswählt, bzw. wie kann ich abfragen wohin der Rechtsklick gezeigt hat?

    Ich hoffe, ich habe mein Anliegen verständlich machen können.

    LG
    Peter
    @Peter329 Du könntest das Click in Deinen MouseDown-Code übernehmen und dort Links testen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jau, sowas hab ich auch schon ausprobiert.

    VB.NET-Quellcode

    1. Private Sub lvTaskBar_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles lvTaskBar.MouseDown
    2. Dim j As Integer = lvTaskBar.SelectedIndices.Count
    3. Debug.Print("j=" & j.ToString)
    4. If e.Button = MouseButtons.Left Then
    5. If j = 0 Then Exit Sub
    6. Dim i As Integer = lvTaskBar.SelectedIndices(0)
    7. Debug.Print("i=" & i.ToString)
    8. Dim myProgram As String = lvTaskBar.SelectedItems(0).SubItems(1).Text
    9. Try
    10. Process.Start(myProgram)
    11. Catch ex As Exception
    12. MessageBox.Show("Cannot start " & myProgram & newline2 & ex.Message)
    13. End Try
    14. Me.Close()
    15. End If
    16. If e.Button = MouseButtons.Right Then
    17. If j = 0 Then
    18. Me.Close()
    19. Else
    20. MessageBox.Show(Path.GetFileName(lvTaskBar.SelectedItems(0).SubItems(1).Text))
    21. End If
    22. End If
    23. End Sub


    Hier klappt schon der LinksKlick auf ein Icon nicht richtig:

    Beim ersten Linksklick, erhalte ich j=0 (also nichts ausgewählt), obwohl ich ein Icon angeklickt habe.

    Klicke das Icon jetzt noch einmal mit der linken Maustaste an, dann erhalte ich j=1 und das Icon wird mit i=... korrekt ausgewählt.

    Irgendwie verstehe ich die Logik des MouseDown Ereignisses nicht richtig.

    Peter329 schrieb:

    die Logik des MouseDown Ereignisse
    Kann es sein, dass Du erst rechts und dann links klickst?
    Bei 2-maligem Klicken wird die Markierung gesetzt und wieder gelöscht => .SelectedItem wäre dann ggf. Nothing.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nein, ich klicke genau einmal mit der linken Maus Taste. Und danach ist nichts ausgewählt (j=0) und die Prozedur wird mit Exit Sub beendet. Das dies so abläuft sehe ich ja an meinem Debug.Print.

    Wenn ich danach noch einmal die linke Maus Taste betätige, dann ist j=1, der ausgewählte Index i wird richtig gesetzt ... auch diese sehe ich so in meinem Debug.Print.

    Das gleiche Problem tritt mit der rechten Maus Taste auf! Beim ersten Click ist j=0 ... und damit wird mein Programm mit Me.Close beendete ...
    @Peter329 Das kann ich so jetzt nicht nachvollziehen.
    Kannst Du bitte mal ein kleines Projekt anhängen, um das nachzuvollziehen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist der Code ... ich lade (zum Test vereinfacht) nur drei Icons in die TaskBar: notepad, cmd und regedit ... die Farben sind an meinen Desktop angepasst.

    LG
    Peter
    Dateien
    @Peter329 Teste das mal mit ner ListBox: Die linke Maustaste selektiert, die rechte nicht.
    Du musst Dir das Icon über seine Position beschaffen => .net control under mouse
    Dies hier zum Beispiel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    also beim Listview kriegst du das ListviewItem, auf das das MouseDown niedergeht mit

    VB.NET-Quellcode

    1. Private Sub lvTaskBar_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles lvTaskBar.MouseDown
    2. Dim itm = lvTaskBar.GetItemAt(e.X, e.Y)
    Das item ist zu dem Zeitpunkt noch nicht selekiert, und bei Rechtsklick wirds glaub auch garnet selektiert.
    Brauchst du ja auch garnet.
    Erst mal herzlichen Dank, dass ihr euch mit meinem Problem so eingehend befasst habt!

    Ich bin ja erleichtert, dass ich die Sache mit dem Select und dem Mausklick wohl doch richtig verstanden habe. Für alle die es interessiert:

    Soweit ich das sehe, selektiert sowohl die linke als auch die rechte Maustaste. Das Problem ist wohl, dass das MouseDown Event feuert, BEVOR der Eintrag selektiert wurde. Und deshalb wird beim ERSTEN MouseClick nichts gefunden und beim ZWEITEN Mouseclick dann die vorangehende Selection ausgeführt. Das muss man wissen! :)

    Das Click Event feuert aber NACHDEM der Eintrag selektiert wurde. Und so habe ich jetzt mein Problem wie folgt gelöst (Debug und MessageBox zum Testen):

    VB.NET-Quellcode

    1. Private Sub lvTaskBar_Click(sender As Object, e As EventArgs) Handles lvTaskBar.Click
    2. Dim i As Integer = lvTaskBar.SelectedIndices(0)
    3. Debug.Print("i=" & i.ToString)
    4. Dim myProgram As String = lvTaskBar.SelectedItems(0).SubItems(1).Text
    5. Try
    6. 'Process.Start(myProgram)
    7. MessageBox.Show("START " & myProgram)
    8. Catch ex As Exception
    9. MessageBox.Show("Cannot start " & myProgram & newline2 & ex.Message)
    10. End Try
    11. 'Me.Close()
    12. End Sub
    13. Private Sub lvTaskBar_MouseDown(sender As Object, e As MouseEventArgs) Handles lvTaskBar.MouseDown
    14. If e.Button = MouseButtons.Right Then
    15. Dim itm As ListViewItem = lvTaskBar.GetItemAt(e.X, e.Y)
    16. If itm Is Nothing Then
    17. Me.Close()
    18. Else
    19. MessageBox.Show(Path.GetFileName(lvTaskBar.Items(itm.Index).SubItems(1).Text))
    20. End If
    21. End If
    22. End Sub


    So funzt die Sache! Danke für eure Hilfe!

    LG
    Peter

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Peter329“ ()

    @Peter329 Jou.
    Falls Du das Programm noch anderen Usern zur Verfügung stellen willst, kannst Du noch eine Programm-Verwaltung hinzufügen (ich denke, das machst Du schon) und als Schmankerl:
    Entweder per Contextmenü oder per Move: Mach das Programm dockbar, so dass es an jede Bildschirmseite geheftet werden kann.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!