2012年2月13日月曜日

WPFでウィンドウメッセージを処理する

久々にプログラミングの話をば。
前からそうだけどプログラミングTipsのようなものを備忘録的に記していっているので、"備忘録"タグを今度からつけようと思います。

で、今回はWPFでウィンドウメッセージを処理する方法。
WindowsFormではForm.WndProcメソッドをオーバーライドするだけで良かったけど、WPFではその方法は使えない。
WPFではHwndSourceクラスのAddHookメソッドを使うことで、所謂ウィンドウプロシージャとほぼ同様の役目を果たすことができる。

protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);

    WindowInteropHelper helper = new WindowInteropHelper(this);
    HwndSource source = HwndSource.FromHwnd(helper.Handle);
    // もしくは
    // HwndSource source = PresentationSource.FromVisual(this) as HwndSource
    source.AddHook(new HwndSourceHook(WndProc));
}

static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    switch (msg)
    {
        case Win32.WM_MOUSEACTIVATE: // 処理するメッセージ
            handled = true; // ここでメッセージを止める場合はtrue
            return new IntPtr(Win32.MA_NOACTIVATE); // メッセージや処理によって適切な値を返す
    }
    return IntPtr.Zero;
}

ちなみに上記はマウスクリックでウィンドウをアクティブにしないように変更するコードです。
昔のエントリーでは、ウィンドウメッセージを処理する以外の方法を紹介していますので、興味があったらそちらもどうぞ。

WPFでは基本的にはウィンドウメッセージを直接扱う機会は少ないんだけど、他ソフト(プロセス)と関わりあう類のソフトウェアキーボード等のソフトを作る際には触らなければならない場合も少なくないので正直面倒ですね。。。

0 件のコメント:

コメントを投稿