Wie kann ich die "Mouse-Down" -Ereignisse aller Steuerelemente in einem Formular leicht erfassen, ohne manuell jedes Ereignis zu abonnieren? (C#) Etwas wie die "KeyPreview" -Funktion, aber für die Mausereignisse.Abonnieren von Mausereignissen aller Steuerelemente in Formular
Antwort
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);
}
}
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.
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...
}
- 1. VS.NET Tool zum Namen aller Steuerelemente auf Formular
- 2. Angular JS - Formular Newsletter abonnieren
- 3. Abfangen von Mausereignissen in Windows
- 4. Suchen aller Steuerelemente in einem ASP.NET-Panel?
- 5. Generische Methode zum Suchen aller TextBox-Steuerelemente in Silverlight
- 6. Schleife durch einige Steuerelemente in einem Formular
- 7. Ignorieren von in der Warteschlange eingereihten Mausereignissen
- 8. Behandeln Ereignisse aller Steuerelemente in einem VB.net-Formular aus einem Klassenmodul
- 9. Entfernen aller CSS aus Telerik-Steuerelemente
- 10. Deaktivierung aller Steuerelemente, bis der Thread die Ausführung beendet
- 11. WPF: Ändern der Schriftart aller Steuerelemente in einem bestimmten Container
- 12. Abonnieren von Ereignissen in einem WCF-Dienst
- 13. Abonnieren von TeamSystem-Ereignissen
- 14. Aktivieren/Deaktivieren aller ASP-Steuerelemente in Tabelle/Platzhalter
- 15. Windows Formular Steuerelemente Fehler mit MetroFramework
- 16. Liste Name der Steuerelemente und Formular
- 17. Weiterleiten von Mausereignissen durch Ebenen/divs
- 18. HighCharts - Ausblenden/Einblenden von Beschriftungen bei Mausereignissen
- 19. Formular keine Steuerelemente auf dem Gerät anzeigen
- 20. Aktualisieren Sie alle Steuerelemente auf dem Formular
- 21. Erfassen von Tasten drücken für Formular, aber nicht für Steuerelemente
- 22. Umgang mit Mausereignissen in überlappenden SVG-Ebenen
- 23. WinForms - Beeinflusst die Form.DoubleBuffered-Eigenschaft die Steuerelemente in diesem Formular?
- 24. Wie alle Steuerelemente in dem Formular außer einer Schaltfläche deaktivieren?
- 25. Warum fehlen Steuerelemente von Me.Controls()
- 26. abonnieren Sie msmq
- 27. JavaScript Zuordnung Berührungsereignisse zu Mausereignissen
- 28. Umgang mit einem Klick für alle Steuerelemente in einem Formular
- 29. Wie puffern Sie .NET-Steuerelemente in einem Formular doppelt?
- 30. Machen Sie alle Steuerelemente in einem Formular auf einmal schreibgeschützt