Ir para o conteúdo

Sub Classing a WPF Application’s WndProc

nov 12, 2013 | 42Gears Team

Applies to:
Product General
Platform Windows

With the introduction of Windows Presentation Foundation (WPF), developers can now create rich User Interface applications which is preferred by end users. While developing such applications, sometimes there can be a need to intercept the Window messages. This can be achieved easily in Win32 and WinForm applications and one would wonder is this possible in WPF as well? The answer to this question is, yes it is possible. This article does exactly that and will explain how to Sub class a WPF application’s WndProc.

.Net Classes Used

  1. WindowInteropHelper : This class is needed to retrieve the handle of the WPF application window.
  2. HwndSource : The class will provide a method to hook the WndProc of the WPF application.

Code Snippet

private void MainWindowLoaded(object sender, RoutedEventArgs e)

{
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
source.AddHook(new HwndSourceHook(WndProc));
}

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam,ref bool handled)
{
if(msg==WM_CLOSE)
{
//Avoiding a close event
handled=true;
}
return IntPtr.Zero;
}

In the above Snippet, the WindowInteropHelper class provides the handle to the WPF application window which is passed to the HwndSource class and the AddHook method allows to intercept the Window messages using a WndProc, which is WM_CLOSE in this case

NOTE: The HwndSource object should be created only in the Loaded event of your application because that’s when your WPF application is assigned a Window handle, else the WindowInteropHelper class will return an invalid handle.

Download Source Files

Read more about our products:

      

Subscribe for our free newsletter

Thank you! you are successfully subscribed.
newsletter

Exclusive News and Updates on Enterprise Mobility!

* I consent to receive newsletters via email from 42Gears and its Affiliates.
Please agree
* I have reviewed and agreed to 42Gears Privacy Policy and Terms of Use prior to subscribing and understand that I may change my preference or unsubscribe at any time.
Please agree
Please verify captcha
Please enter a valid official email