WPF: Onde está o WndProc()?

No Windows Forms podemos facilmente sobrescrever o método WndProc (Abreviação de Window Procedure) para fazer um tratamento personalizado das mensagens do Windows.

Porém, no WPF nos deparamos com o seguinte problema: Não há nenhum método WndProc para sobrescrever!

Isso se deve porque o WPF possui uma estrutura diferente dos demais aplicativos Win32. Posso citar como principal diferença o fato de no WPF não ser usado o GDI+ para renderizar a UI e sim o DirectX. Não irei me aprofundar muito nestas coisas pois não é o objetivo deste post…

De fato, no WPF raramente precisamos “mexer” com as mensagens do Win32. Mas como fazer caso precisarmos?

Simples! Segue uma implementação do WndProc:

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)
        {
            // Aqui fazemos o tratamento das mensagens

            return IntPtr.Zero; // Essa linha é OBRIGATÓRIA
        }
    }
}

Ela é um pouco diferente da implementação no WinForms, mas o funcionamento é o mesmo.

Usando o HwndSource podemos, também, obter o Handle (HWND, no Win32) da janela. Veja a documentação desta classe no MSDN:

Classe HwndSource (System.Windows.Interop)

Até a próxima.

Anúncios

Deixe um comentário :)

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s