WPFでWndProcイベントをキャプチャーする - WPF

WPFでWndProcイベントをキャプチャーするコードを紹介します。

概要

WinFormアプリケーションではWndProcイベントをキャプチャーする場合にはWndProcメソッドをオーバーライドすればWndProcイベントをキャプチャーできましたが、WPFではこの方法は使えません。
WPFでWndProcをキャプチャーする場合には、フォームのLoadedイベントでHwndSourceクラスのAddHookメソッドを呼び出しすべてのウィンドウメッセージを受け取るイベントハンドラを設定します。
コード例
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
source.AddHook(new HwndSourceHook(WndProc));

プログラム例

以下のコードは、WndProcをキャプチャーしてフォームを閉じれないウィンドウを作成します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Interop;

namespace WpfWndProc
{
  /// <summary>
  /// MainWindow.xaml の相互作用ロジック
  /// </summary>
  public partial class MainWindow : Window
  {
    const int WM_CLOSE = 0x0010;

    public MainWindow()
    {
      InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
      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)
    {
      if (msg == WM_CLOSE) {
        handled = true;
      }
      return IntPtr.Zero;
    }
  }
}
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2010-08-10
iPentec all rights reserverd.