¿Cómo manejar mensajes WndProc en WPF?

Resuelto Shuft asked hace 15 años • 9 respuestas

En Windows Forms, simplemente anulaba WndProcy comenzaba a manejar los mensajes a medida que llegaban.

¿Alguien puede mostrarme un ejemplo de cómo lograr lo mismo en WPF?

Shuft avatar Mar 09 '09 04:03 Shuft
Aceptado

Puedes hacer esto a través del System.Windows.Interopespacio 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

Robert MacLean avatar Dec 18 '2009 07:12 Robert MacLean

En realidad, hasta donde tengo entendido, tal cosa es posible en WPF usando HwndSourcey 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.

Noldorin avatar Mar 08 '2009 22:03 Noldorin