En Windows Forms, simplemente anularía WndProc
y comenzaría a manejar los mensajes a medida que ingresaban.
¿Alguien puede mostrarme un ejemplo de cómo lograr lo mismo en WPF?
En realidad, hasta donde tengo entendido, tal cosa es posible en WPF usando HwndSource
y HwndSourceHook
. Vea este hilo en MSDN como ejemplo. (Código relevante incluido a continuación)
// '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;
}
Ahora, no estoy muy seguro de por qué querría manejar los mensajes de Windows Messaging en una aplicación WPF (a menos que sea la forma más obvia de interoperabilidad para trabajar con otra aplicación WinForms). La ideología de diseño y la naturaleza de la API son muy diferentes en WPF de WinForms, por lo que le sugiero que se familiarice más con WPF para ver exactamente por qué no existe un equivalente de WndProc.
WM_MOUSEWHEEL
por ejemplo, la única forma de capturar esos mensajes de manera confiable era agregando elWndProc
a una ventana de WPF. Esto funcionó para mí, mientras que el funcionarioMouseWheelEventHandler
simplemente no funcionó como se esperaba. No pude alinear los taquiones WPF correctos para obtener un comportamiento confiableMouseWheelEventHandler
, de ahí la necesidad de acceso directo al archivoWndProc
.Puede hacer esto a través del
System.Windows.Interop
espacio de nombres que contiene una clase llamadaHwndSource
.Ejemplo de uso de esto
Completamente tomado de la excelente publicación del blog: Uso de un WndProc personalizado en aplicaciones WPF de Steve Rands
fuente
fuente
Si no le importa hacer referencia a WinForms, puede usar una solución más orientada a MVVM que no combine el servicio con la vista. Necesita crear e inicializar un System.Windows.Forms.NativeWindow, que es una ventana liviana que puede recibir mensajes.
Use SpongeHandle para registrarse para los mensajes que le interesan y luego anule WndProc para procesarlos:
El único inconveniente es que debe incluir la referencia System.Windows.Forms, pero por lo demás, esta es una solución muy encapsulada.
Se puede leer más sobre esto aquí.
fuente
Aquí hay un enlace sobre cómo anular WindProc usando comportamientos: http://10rem.net/blog/2010/01/09/a-wpf-behavior-for-window-resize-events-in-net-35
[Editar: más vale tarde que nunca] A continuación se muestra mi implementación basada en el enlace anterior. Aunque revisando esto, me gustan más las implementaciones de AddHook. Podría cambiar a eso.
En mi caso, quería saber cuándo se estaba cambiando el tamaño de la ventana y un par de cosas más. Esta implementación se conecta al xaml de Windows y envía eventos.
fuente
Here is a link...
respuestas exactas: como arriba.Puede adjuntar a la clase 'SystemEvents' de la clase Win32 incorporada:
en una clase de ventana WPF:
fuente
Hay formas de manejar mensajes con un WndProc en WPF (por ejemplo, usando un HwndSource, etc.), pero generalmente esas técnicas están reservadas para la interoperabilidad con mensajes que no se pueden manejar directamente a través de WPF. La mayoría de los controles WPF ni siquiera son ventanas en el sentido de Win32 (y por extensión Windows.Forms), por lo que no tendrán WndProcs.
fuente
WndProc
a invalidarse, leSystem.Windows.Interop
permite obtener unHwndSource
objeto a través deHwndSource.FromHwnd
o alPresentationSource.FromVisual(someForm) as HwndSource
que puede vincular un delegado con un patrón especial. Este delegado tiene muchos de los mismos argumentos que unWndProc
objeto Mensaje.WPF no funciona en WinForms tipo wndprocs
Puede alojar un HWndHost en un elemento WPF apropiado y luego anular el wndproc de Hwndhost, pero AFAIK eso es lo más cercano que va a conseguir.
http://msdn.microsoft.com/en-us/library/ms742522.aspx
http://blogs.msdn.com/nickkramer/archive/2006/03/18/554235.aspx
fuente
La respuesta corta es que no puedes. WndProc funciona pasando mensajes a un HWND en un nivel Win32. Las ventanas de WPF no tienen HWND y, por lo tanto, no pueden participar en los mensajes de WndProc. El bucle de mensajes de WPF base se encuentra encima de WndProc, pero los abstrae de la lógica central de WPF.
Puede usar un HWndHost y obtener un WndProc para ello. Sin embargo, es casi seguro que esto no es lo que desea hacer. Para la mayoría de los propósitos, WPF no opera en HWND y WndProc. Es casi seguro que su solución se basa en realizar un cambio en WPF, no en WndProc.
fuente