2009-09-03 14 views

Antwort

1

Lösung 1

zu jeder Anmeldung und jedem Ereignis auf jeder Kontrolle innerhalb einer Form ist sicherlich der einfachste Ansatz, da Sie nur den von Ramesh angegebenen Code verwenden.

Eine andere Technik umfasst jedoch das Überschreiben der standardmäßigen Windows-Nachrichtenverarbeitungsmethode ("WndProc") auf dem übergeordneten Steuerelement - in diesem Fall das Formular, das alle Steuerelemente enthält. Dies hat einen Nebeneffekt, den Sie nicht erkennen können, wenn sich der Mauszeiger über Steuerelemente bewegt, die in einem anderen übergeordneten Steuerelement enthalten sind.

Zum Beispiel können Sie nicht erkennen, wenn sich der Mauszeiger über einem TextBox befindet, das in einem enthalten ist. Dies liegt daran, dass die TabControl weiterhin alle Mausereignisse verarbeitet.

Lösung 2

Die folgende Lösung wird alle Probleme bei dem Versuch, überwinden, auf die sich der Mauszeiger über Verwendung einer Technik, die als Fenster einhakt bekannt ist, die Kontrolle nachzuweisen.

Die Hooks ermöglichen es uns im Wesentlichen, Maus- und Tastaturereignisse einzufangen, noch bevor sie mit Fokus auf das Fenster gesendet werden.

Hier ist ein Beispiel:

public enum HookType : int 
    { 
    WH_JOURNALRECORD = 0, 
    WH_JOURNALPLAYBACK = 1, 
    WH_KEYBOARD = 2, 
    WH_GETMESSAGE = 3, 
    WH_CALLWNDPROC = 4, 
    WH_CBT = 5, 
    WH_SYSMSGFILTER = 6, 
    WH_MOUSE = 7, 
    WH_HARDWARE = 8, 
    WH_DEBUG = 9, 
    WH_SHELL = 10, 
    WH_FOREGROUNDIDLE = 11, 
    WH_CALLWNDPROCRET = 12, 
    WH_KEYBOARD_LL = 13, 
    WH_MOUSE_LL = 14 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct POINT 
    { 
    public int X; 
    public int Y; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct MouseHookStruct 
    { 
    public POINT pt; 
    public int hwnd; 
    public int hitTestCode; 
    public int dwExtraInfo; 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern int SetWindowsHookEx(HookType hook, HookProc callback, IntPtr hInstance, uint dwThreadId); 

    [DllImport("user32.dll", SetLastError= true)] 
    static extern int CallNextHookEx(int hook, int code, IntPtr wParam, IntPtr lParam); 

    [DllImport("kernel32.dll")] 
    static extern int GetLastError(); 

    [DllImport("kernel32.dll")] 
    static extern int GetCurrentThreadId(); 

    public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); 
    private static int hHook; 

    public Form1() 
    { 
    InitializeComponent(); 

    hHook = SetWindowsHookEx(HookType.WH_MOUSE, MouseHookProc, IntPtr.Zero, (uint)GetCurrentThreadId()); 
    if (hHook == 0) 
    MessageBox.Show("GetLastError: " + GetLastError()); 
    } 

    private int MouseHookProc(int code, IntPtr wParam, IntPtr lParam) 
    { 
    //Marshall the data from the callback. 
    MouseHookStruct mouseInfo = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct)); 

    if (code < 0) 
    { 
    return CallNextHookEx(hHook, code, wParam, lParam); 
    } 
    else 
    { 
    //Create a string variable that shows the current mouse coordinates. 
    String strCaption = "x = " + mouseInfo.pt.X.ToString("d") + 
    " y = " + mouseInfo.pt.Y.ToString("d"); 

    //You must get the active form because it is a static function. 
    Form tempForm = Form.ActiveForm; 

    Control c = Control.FromHandle((IntPtr)mouseInfo.hwnd); 
    if (c != null) 
    label1.Text = c.Name; 
    else 
    label1.Text = "Control not found"; 

    //Set the caption of the form. 
    tempForm.Text = strCaption; 

    return CallNextHookEx(hHook, code, wParam, lParam); 
    } 
    } 
1

Andere Steuerelemente im Formular können die Mouse-Ereignishandler des Formulars nicht abhören. Weil jedes Steuerelement eigene Mausereignislistener hat.

Aber Sie können die einzelnen Kontrollen Mausereignisse auf die Formen Mausereignisse

this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MDown);  
this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MDown); 
this.ListBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MDown); 

diese Weise abonnieren Sie einzelne Handler für alle Steuerelemente Mausereignisse haben.

2

ich dies die beste Lösung für meine Zwecke erwiesen.

eine neue Klasse von IMessageFilter abgeleitet erstellen:

public class GlobalMouseHandler : IMessageFilter 
{ 

    private const int WM_LBUTTONDOWN = 0x201; 

    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONDOWN) 
     { 
      // do something 
      ((YourMainForm)Form.ActiveForm).YourMainForm_Click(null, null); 
     } 
     return false; 
    } 
} 

dann in der Hauptform fügen Sie diese den Nachrichtenfilter registrieren:

GlobalMouseHandler globalClick = new GlobalMouseHandler(); 
Application.AddMessageFilter(globalClick); 

Und diese Funktion hinzuzufügen, zu tun, was Sie haben, in Ihrer Form:

public void YourMainForm_Click(object sender, EventArgs e) 
{ 
    // do anything here... 
} 
Verwandte Themen