¿Cómo manejar mensajes WndProc en WPF?
En Windows Forms, simplemente anulaba WndProc
y comenzaba a manejar los mensajes a medida que llegaban.
¿Alguien puede mostrarme un ejemplo de cómo lograr lo mismo en WPF?
Puedes hacer esto a través del System.Windows.Interop
espacio de nombres que contiene una clase llamada HwndSource
.
Ejemplo de uso de esto
using System;
using System.Windows;
using System.Windows.Interop;
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
source.AddHook(WndProc);
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
// Handle messages...
return IntPtr.Zero;
}
}
}
Completamente tomado de la excelente publicación del blog: Uso de un WndProc personalizado en aplicaciones WPF de Steve Rands
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ías manejar los mensajes de mensajería de Windows 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 y en WinForms, por lo que le sugiero que se familiarice más con WPF para ver exactamente por qué no existe un equivalente de WndProc.