Share via


Como usar el WndProc en una Ventana WPF

Básico

WPF es una parte del .Net Framework muy robusta, pero a veces necesitamos que nuestra aplicación interactue con aspectos más relacionados con el sistema de ventanas del OS. En estos casos requerimos interceptar mensajes en el WndProc.

Lecturas recomendadas

Si de plano no sabes que es el WndProc no te pierdas este otro artículo que te pondrá en contexto: Qué es el bucle de mensajes, message loop o WndProc ?
Más abajo verás que necesitamos obtener un handler a la ventana WPF, para ello revisa: C# – Como obtener un manejador (handle) para una ventana de WPF

Para lograr acceder al WndProc debemos obtener un manejador (handle) para la ventana WPF y seguidamente utilizar la clase utilitaria HwndSource para crear el Hook, allí creamos un delegado el cual hara las veces de WndProc de nuestra ventana

 WindowInteropHelper interopHelper;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    //Conseguir el Handle de la ventana
    interopHelper = new WindowInteropHelper(this);

    //Crear un hook al WndProc
    HwndSource sourceWindow = HwndSource.FromHwnd(interopHelper.Handle);
    sourceWindow.AddHook(WndProc);
}

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    //Hacer algo...

    return IntPtr.Zero;
}

Y eso es todo ;)