Winforms : Abfangen der Maus-Event auf der Main Form zunächst nicht auf Steuerelemente
Es ist sicherlich ein bequemer Weg, dies zu tun :
Implementierte ich ein "Fenster Verschieben" auf die Maus ziehen Verhalten auf meinem main-form,
und ich möchte, dass der Mausklick/Move-Ereignis abgefangen werden, durch die form, nicht durch Kontrollen, die in ihm sind.
Ich würde gerne ein Äquivalent zu/replizieren die "KeyPreview" - Eigenschaft für Maus-Ereignisse
Außerdem möchte ich vermeiden Umleiten der Maus-Event auf der Main-Methode des Formulars 12-mal in 12-Steuerelemente " Maus-Ereignisse einzeln (das ist der hässliche workaround habe ich bisher Gefunden)
Irgendwelche Ideen ?
- Tun das Kind steuert auch den Umgang mit der Maus klicken/bewegen von events?
- Einige von Ihnen, nicht alle. Und ich will unbedingt vermeiden, dass die Maus-Event auf der Main-Methode des Formulars 12 mal in 12 Steuert
- Sie können einen message filter. (Trivial-Antwort konvertiert Kommentar automatisch.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abonnieren alle Bedienelemente MouseMove-Ereignisse (betrachten Sie es tun rekursiv verschachtelte Steuerelemente)
Und erhöhen MouseMove in diesem event-handler
Beachten Sie, dass die Kontrollen erhalten Mausevents mit lokalen Koordinaten der Kontrolle. So müssen Sie konvertieren Sie es in form von Koordinaten.
Es könnte sein, Nachteile, die mit geschachtelten Steuerelementen, aber ich überlasse es Ihnen (z.B. call-Eltern.PointToClient)
UPDATE: Sie sind immer noch in der Lage sein, um die Ereignisse verarbeiten von control - einfach abonnieren-Ereignis ein weiteres mal.
Könnten Sie einen globalen Maus-Hook zum abfangen von Mouse-events, es gibt eine Beispiel auf der MSDN-Website
Basierend auf Ihre Kommentare,
Umsetzung der redirect-Funktionalität der Maus, die Veranstaltung in eine Basisklasse, dann alle Steuerelemente ableiten von der Basisklasse.
Damit Sie nur die Funktionalität implementieren, die einmal und dann alle Steuerelemente "rethrow" die Maus-Ereignis abgefangen werden, durch die Haupt-Form.
Hoffe, das hilft.
Überschreiben Sie die Kontrolle.PreProcessMessage Methode:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.preprocessmessage.aspx
Edit:
Scheint es PreProcessMessage funktioniert möglicherweise nicht für Maus-Ereignisse. Versuchen Sie überschreiben WndPrc statt. Zum abfangen der Maus-Nachrichten für sicher, aber Sie brauchen, um zu sehen, wenn er fängt Sie in der Reihenfolge, die Sie wollen:
http://bytes.com/topic/c-sharp/answers/752144-preprocessmessage
Können Sie GlobalMouseKeyHook Bibliothek leicht abfangen systemweit Maus position.
Auf die Maus klicken, sollten Sie dann überprüfen, wenn die Maus-Position Punkt schneidet Ihre form ODER, wenn das Fenster unter der Maus ist Ihre form.
Um letzteres zu tun, was Sie müssen API-Funktion WindowFromPoint:
Eigentlich benutze ich diese, wenn ich Sie abfangen möchten, klicken Sie außerhalb meiner form (es gibt keinen anderen Weg). In deinem Fall würde ich binden jedes Steuerelement Mausklick aus performance Gründen (Globale hook ist schwer).