Dans Windows Forms, je remplacerais simplement WndProc
et commencerais à gérer les messages au fur et à mesure qu'ils entraient.
Quelqu'un peut-il me montrer un exemple de la façon de réaliser la même chose dans WPF?
En fait, pour autant que je sache, une telle chose est en effet possible dans WPF en utilisant HwndSource
et HwndSourceHook
. Voir ce fil sur MSDN à titre d'exemple. (Code pertinent inclus ci-dessous)
// '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;
}
Maintenant, je ne sais pas trop pourquoi vous voudriez gérer les messages Windows Messaging dans une application WPF (à moins que ce ne soit la forme d'interopérabilité la plus évidente pour travailler avec une autre application WinForms). L'idéologie de conception et la nature de l'API sont très différentes dans WPF de WinForms, je vous suggère donc de vous familiariser davantage avec WPF pour voir exactement pourquoi il n'y a pas d'équivalent de WndProc.
WM_MOUSEWHEEL
par exemple, le seul moyen de capturer ces messages de manière fiable était d'ajouter leWndProc
à une fenêtre WPF. Cela a fonctionné pour moi, alors que le fonctionnaireMouseWheelEventHandler
n'a tout simplement pas fonctionné comme prévu. Je n'ai pas pu obtenir les bons tachyons WPF alignés juste pour obtenir un comportement fiableMouseWheelEventHandler
, d'où la nécessité d'un accès direct auWndProc
.Vous pouvez le faire via l'
System.Windows.Interop
espace de noms qui contient une classe nomméeHwndSource
.Exemple d'utilisation de ceci
Complètement extrait de l'excellent article de blog: Utilisation d'un WndProc personnalisé dans les applications WPF par Steve Rands
la source
la source
Si cela ne vous dérange pas de faire référence à WinForms, vous pouvez utiliser une solution plus orientée MVVM qui ne couple pas le service avec la vue. Vous devez créer et initialiser un System.Windows.Forms.NativeWindow qui est une fenêtre légère qui peut recevoir des messages.
Utilisez SpongeHandle pour vous inscrire aux messages qui vous intéressent, puis remplacez WndProc pour les traiter:
Le seul inconvénient est que vous devez inclure la référence System.Windows.Forms, mais sinon c'est une solution très encapsulée.
Plus d'informations à ce sujet peuvent être lues ici
la source
Voici un lien sur le remplacement de WindProc à l'aide de Behaviors: http://10rem.net/blog/2010/01/09/a-wpf-behavior-for-window-resize-events-in-net-35
[Edit: mieux vaut tard que jamais] Voici mon implémentation basée sur le lien ci-dessus. Bien que revisitant cela, j'aime mieux les implémentations AddHook. Je pourrais passer à ça.
Dans mon cas, je voulais savoir quand la fenêtre était redimensionnée et quelques autres choses. Cette implémentation se connecte au xaml Windows et envoie des événements.
la source
Here is a link...
réponses exactes , comme ci-dessus.Vous pouvez vous attacher à la classe 'SystemEvents' de la classe Win32 intégrée:
dans une classe de fenêtre WPF:
la source
Il existe des moyens de gérer les messages avec un WndProc dans WPF (par exemple en utilisant un HwndSource, etc.), mais généralement ces techniques sont réservées à l'interopérabilité avec des messages qui ne peuvent pas être traités directement via WPF. La plupart des contrôles WPF ne sont même pas des fenêtres au sens Win32 (et par extension Windows.Forms), ils n'auront donc pas WndProcs.
la source
WndProc
au remplacement, leSystem.Windows.Interop
vous permet d'obtenir unHwndSource
objet viaHwndSource.FromHwnd
ouPresentationSource.FromVisual(someForm) as HwndSource
, auquel vous pouvez lier un délégué spécialement conçu. Ce délégué a plusieurs des mêmes arguments qu'unWndProc
objet Message.WPF ne fonctionne pas sur les wndprocs de type WinForms
Vous pouvez héberger un HWndHost dans un élément WPF approprié, puis remplacer le wndproc de Hwndhost, mais AFAIK est aussi proche que vous allez l'obtenir.
http://msdn.microsoft.com/en-us/library/ms742522.aspx
http://blogs.msdn.com/nickkramer/archive/2006/03/18/554235.aspx
la source
La réponse courte est que vous ne pouvez pas. WndProc fonctionne en passant des messages à un HWND au niveau Win32. Les fenêtres WPF n'ont pas de HWND et ne peuvent donc pas participer aux messages WndProc. La boucle de message WPF de base se trouve au-dessus de WndProc mais elle les fait abstraction de la logique WPF principale.
Vous pouvez utiliser un HWndHost et obtenir un WndProc pour cela. Cependant, ce n'est certainement pas ce que vous voulez faire. Dans la plupart des cas, WPF ne fonctionne pas sur HWND et WndProc. Votre solution repose presque certainement sur la modification de WPF et non de WndProc.
la source