2010-04-18 7 views
0

Est-il possible de gérer un événement mouseDown dans VB.Net (2008) quel que soit le contrôle qui déclenche l'événement mouseDown? Fondamentalement, je veux juste attraper un événement mouseDown au "niveau de la forme" et ne veux pas programmer les gestionnaires d'événements mouseDown dans chaque contrôle. Y a-t-il un moyen de faire cela?Gestion d'un événement MouseDown indépendamment du contrôle

+1

Est-ce dans Windows Forms ou WPF? –

+0

Windows Forms (VB.Net/VS 2008) – GregH

+1

Répétition de http://stackoverflow.com/questions/2609325/are-vb-net-eventargs-maintained-at-a-system-level –

Répondre

4

Ceci est très inhabituel, vous avez presque toujours vraiment soin de ce que le contrôle particulier a été cliqué. Et avoir un événement MouseDown qui prend une action spécifique, basée sur le contrôle cliqué. Mais vous pouvez, vous pouvez attraper les événements d'entrée avant qu'ils soient envoyés au contrôle lui-même. Vous devez utiliser l'interface IMessageFilter. Meilleur expliqué avec un exemple de code:

Public Class Form1 
    Implements IMessageFilter 

    Public Sub New() 
    InitializeComponent() 
    Application.AddMessageFilter(Me) 
    End Sub 

    Protected Overrides Sub OnFormClosed(ByVal e As System.Windows.Forms.FormClosedEventArgs) 
    Application.RemoveMessageFilter(Me) 
    End Sub 

    Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage 
    REM catch WM_LBUTTONDOWN 
    If m.Msg = &H201 Then 
     Dim pos As New Point(m.LParam.ToInt32()) 
     Dim ctl As Control = Control.FromHandle(m.HWnd) 
     If ctl IsNot Nothing Then 
     REM do something... 
     End If 
     REM next line is optional 
     Return False 
    End If 
    End Function 
End Class 

Prenez garde que ce filtre est actif pour toutes les formes dans votre application. Vous aurez besoin de filtrer sur la valeur ctl si vous voulez la rendre spécifique à un seul formulaire.

+0

Le problème auquel je suis confronté est que j'utilise un contrôle développé sur mesure. Il semble que pour une raison quelconque, la personne qui l'a écrite ne gère pas l'événement mouseDown car lorsque je gère l'événement mouseDown pour le contrôle, l'événement ne se déclenche jamais. – GregH

+1

@GregH: cela sonne une cloche. Je vous ai déjà donné une solution pour cela: http://stackoverflow.com/questions/2609325/are-vb-net-eventargs-maintained-at-a-system-level –

+0

L'événement 'MouseDown' se produit pour * toute * souris bouton, pas seulement pour le LMB, donc le code devrait également être ajusté pour cela. – mbomb007

1
Private Sub Form1_Load(ByVal sender As System.Object, _ 
         ByVal e As System.EventArgs) Handles MyBase.Load 
    'note - this will NOT work for containers i.e. tabcontrols, etc 
    For Each c In Me.Controls 
     Try 
      AddHandler DirectCast(c, Control).MouseDown, AddressOf Global_MouseDown 
     Catch ex As Exception 
      Debug.WriteLine(ex.Message) 
     End Try 
    Next 
End Sub 

Private Sub Global_MouseDown(ByVal sender As Object, _ 
           ByVal e As System.Windows.Forms.MouseEventArgs) 
    Debug.WriteLine(DirectCast(sender, Control).Name) 
End Sub 
Questions connexes