2015-05-21 4 views
10

Ich habe mich umgesehen und habe nicht wirklich viele Informationen darüber gesehen, warum jemand Wndproc mit Nachrichten umgehen würde.Warum überschreiben wndproc

Also ich frage:

Warum es tun?

Wann es geht?

Was ist der allgemeine Zweck in C#?

Ich habe versucht, es zu verwenden, wenn ich eine serielle COM gesehen habe, die vom Computer getrennt und getrennt wurde, aber ich fühlte mich besser auf Methoden verlassen, die ich selbst erstellt habe.

Andere Meldungen, die ich sehe, sind Tastenbetätigungen, Cursoreinstellungen und andere verschiedene Aktionen. Die meisten dieser Dinge haben bereits eingebaute Methoden in C# -Bibliotheken. Also bin ich wieder bei meinen drei Hauptfragen. Alle Informationen, Meinungen, Beispiele, usw. wären toll.

+0

Diese Frage wurde auf Meta: https://meta.stackoverflow.com/a/295041/3614835 gestellt –

Antwort

12

WndProc() ist sehr, sehr Kern der Art, wie ein Windows-Fenster funktioniert. Es ist eine verwaltete Wrapper-Methode um die Fensterprozedur, eine Funktion, die früher in C geschrieben wurde. Auf diese Weise passen Sie das Verhalten eines Fensters an und reagieren unterschiedlich auf Benachrichtigungen, die vom Betriebssystem oder anderen Programmen generiert werden.

Normalerweise müssen Sie sie nicht überschreiben, da die WndProc() - Methode in der Basisklasse die meisten Basisbenachrichtigungen verarbeitet. Verwandeln Sie sie in freundliche .NET-Ereignisse, wie Klick usw. Aber das ist nicht vollständig, entweder weil die Benachrichtigung zu obskur ist oder nicht, weil sie nichts über die Nachrichten wissen kann, die von einem benutzerdefinierten Fenster verwendet werden. In diesem Fall können Sie auf das Überschreiben von WndProc() zurückgreifen, um die Nachricht abzufangen. Das beste Beispiel, das ich mir vorstellen kann, ist das Erstellen eines randlosen Fensters, um einen benutzerdefinierten Fensterrahmen zu zeichnen und dem Fenster trotzdem ein normales Verhalten zu geben. Am einfachsten durch Abfangen von Nachrichten wie WM_NCHITTEST, nicht von .NET eingepackt.

Wirklich grokking WndProc() erfordert lesen Petzolds bahnbrechendes Buch "Programmierung Windows". Vielleicht ist es heute nicht mehr so ​​einfach zu verstehen, es setzt ein grundlegendes Verständnis der Sprache C voraus. Vor 30 Jahren war die Sprache der Winapi die Sprache, objektorientierte Sprachen waren damals nicht weit verbreitet oder verfügbar. Das erklärt auch, warum das Schreiben von Code innerhalb von WndProc() ziemlich schmerzhaft ist, es gibt sehr wenig Abstraktion und man kann Pointer nicht wirklich ignorieren.

Microsoft hat darum bemühen, es in den Ruhestand, mit Windows 8 und der api WinRT beginnen. Nicht gerade ein Slamdunk-Erfolg, vielleicht wird Windows 10 es etwas antreiben. Die grundlegende Technologie, die WinRT unter die Haube bringt, ist COM, ein großer Schritt von C, weil es ein Objektmodell unterstützen kann. Wenngleich es auch in den freundlichen Sprache Projektionen versteckt, ist COM-Programmierung etwas, die meisten Programmierer versuchen zu vermeiden :)

0

ich gefunden habe, dass es für die Verarbeitung von keypress Veranstaltungen für ein Benutzersteuerelement nützlich ist.

Die Keypress-, KeyDown- oder KeyUp-Ereignisse reagieren sehr empfindlich auf ein UserControl (selbst wenn KeyPreview auf "True" gesetzt ist). Ich habe festgestellt, dass, wenn ich WndProc() überschreibe, ich viel mehr Zuverlässigkeit der Steuerung habe, die den Befehl verarbeitet.

Verwandte Themen