In Windows Forms habe ich nur überschrieben WndProc
und angefangen, Nachrichten zu verarbeiten, sobald sie eingegangen sind.
Kann mir jemand ein Beispiel zeigen, wie man in WPF dasselbe erreicht?
Soweit ich weiß, ist so etwas in WPF tatsächlich mit HwndSource
und möglich HwndSourceHook
. Sehen Sie sich diesen Thread auf MSDN als Beispiel an. (Relevanter Code unten enthalten)
// 'this' is a Window
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
source.AddHook(new HwndSourceHook(WndProc));
private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
// do stuff
return IntPtr.Zero;
}
Ich bin mir nicht ganz sicher, warum Sie Windows Messaging-Nachrichten in einer WPF-Anwendung verarbeiten möchten (es sei denn, dies ist die offensichtlichste Form der Interop-Funktion für die Arbeit mit einer anderen WinForms-App). Die Designideologie und die Art der API unterscheiden sich in WPF stark von WinForms. Ich würde daher empfehlen, dass Sie sich nur mit WPF vertraut machen, um genau zu sehen, warum es kein Äquivalent zu WndProc gibt.
WM_MOUSEWHEEL
Die einzige Möglichkeit, diese Nachrichten zuverlässig abzufangen, bestand beispielsweise darin,WndProc
sie einem WPF-Fenster hinzuzufügen . Das hat bei mir funktioniert, während der BeamteMouseWheelEventHandler
einfach nicht wie erwartet funktioniert hat. Ich war nicht in der Lage, die richtigen WPF-Tachyonen genau richtig auszurichten, um ein zuverlässiges Verhalten zuMouseWheelEventHandler
erzielen, weshalb ein direkter Zugriff auf die erforderlich warWndProc
.Sie können dies über den
System.Windows.Interop
Namespace tun, der eine Klasse mit dem Namen enthältHwndSource
.Beispiel für die Verwendung
Vollständig aus dem ausgezeichneten Blog-Beitrag entnommen: Verwenden eines benutzerdefinierten WndProc in WPF-Apps von Steve Rands
quelle
quelle
Wenn es Ihnen nichts ausmacht, auf WinForms zu verweisen, können Sie eine MVVM-orientierte Lösung verwenden, die den Dienst nicht mit der Ansicht koppelt. Sie müssen ein System.Windows.Forms.NativeWindow erstellen und initialisieren. Dies ist ein kompaktes Fenster, das Nachrichten empfangen kann.
Verwenden Sie SpongeHandle, um sich für Nachrichten zu registrieren, an denen Sie interessiert sind, und überschreiben Sie dann WndProc, um sie zu verarbeiten:
Der einzige Nachteil ist, dass Sie die System.Windows.Forms-Referenz einschließen müssen, ansonsten ist dies eine sehr gekapselte Lösung.
Mehr dazu lesen Sie hier
quelle
Hier ist ein Link zum Überschreiben von WindProc mithilfe von Verhalten: http://10rem.net/blog/2010/01/09/a-wpf-behavior-for-window-resize-events-in-net-35
[Bearbeiten: besser spät als nie] Unten ist meine Implementierung basierend auf dem obigen Link. Obwohl ich das noch einmal besuche, mag ich die AddHook-Implementierungen besser. Ich könnte dazu wechseln.
In meinem Fall wollte ich wissen, wann die Größe des Fensters geändert wurde und ein paar andere Dinge. Diese Implementierung wird mit dem Fenster xaml verbunden und sendet Ereignisse.
quelle
Here is a link...
Antworten wie oben.Sie können an die 'SystemEvents'-Klasse der integrierten Win32-Klasse anhängen:
in einer WPF-Fensterklasse:
quelle
Es gibt Möglichkeiten, Nachrichten mit einem WndProc in WPF zu verarbeiten (z. B. mithilfe einer HwndSource usw.). Im Allgemeinen sind diese Techniken jedoch für die Interaktion mit Nachrichten reserviert, die nicht direkt über WPF verarbeitet werden können. Die meisten WPF-Steuerelemente sind nicht einmal Windows im Sinne von Win32 (und im weiteren Sinne Windows.Forms), daher verfügen sie nicht über WndProcs.
quelle
WndProc
Überschreibung ausgesetzt. Mit dieser OptionSystem.Windows.Interop
können Sie jedoch einHwndSource
Objekt überHwndSource.FromHwnd
oder abrufen, an das SiePresentationSource.FromVisual(someForm) as HwndSource
einen speziell strukturierten Delegaten binden können. Dieser Delegat hat viele der gleichen Argumente wie einWndProc
Nachrichtenobjekt.WPF funktioniert nicht mit WinForms-Typ wndprocs
Sie können einen HWndHost in einem geeigneten WPF-Element hosten und dann den wndproc des Hwndhost überschreiben, aber AFAIK ist so nah wie möglich.
http://msdn.microsoft.com/en-us/library/ms742522.aspx
http://blogs.msdn.com/nickkramer/archive/2006/03/18/554235.aspx
quelle
Die kurze Antwort lautet: Sie können nicht. WndProc übergibt Nachrichten auf Win32-Ebene an einen HWND. WPF-Fenster haben kein HWND und können daher nicht an WndProc-Nachrichten teilnehmen. Die Basis-WPF-Nachrichtenschleife befindet sich zwar über WndProc, abstrahiert sie jedoch von der WPF-Kernlogik.
Sie können einen HWndHost verwenden und einen WndProc dafür erhalten. Dies ist jedoch mit ziemlicher Sicherheit nicht das, was Sie tun möchten. In den meisten Fällen arbeitet WPF nicht mit HWND und WndProc. Ihre Lösung basiert mit ziemlicher Sicherheit auf einer Änderung in WPF, nicht in WndProc.
quelle