Mesoscopic Programming

タコさんプログラミング専門

Tips #019 マウスホイールは誰のもの?

マウスの真ん中のダイヤルをぐりぐりすると WM_MOUSEWHEEL メッセージが送られるわけだが、
それがフォーカス所有者あてなのが気に入らない。
だってさ、マウスボタンイベントは普通マウスカーソルの位置にあるウィンドウに来るじゃん。
だったらさ、マウスホイールだってそうじゃなきゃおかしいじゃん。
しょうがないから自分で作ったさ。
でも、なるべくならフックしないで実現できる方法を検討したんだが見つからないかったの。
結局フックしたさ。

BOOL App :: HookMessage( LPMSG pmsg )
{
    NMMOUSE nmm;
    HWND    hWnd;

    if ( pmsg->message == WM_MOUSEWHEEL )
    {
        nmm.pt.x = LOWORD( pmsg->lParam );
        nmm.pt.y = HIWORD( pmsg->lParam );
        hWnd     = WindowFromPoint( nmm.pt );

        if ( hWnd != NULL )
        {
            nmm.hdr.hwndFrom = pmsg->hwnd;
            nmm.hdr.idFrom   = GetDlgCtrlID( nmm.hdr.hwndFrom );
            nmm.hdr.code     = WM_MOUSEWHEEL;
            nmm.dwHitInfo    = pmsg->wParam;

            if ( SendMessage( hWnd, WM_NOTIFY, nmm.hdr.idFrom, ( LPARAM ) & nmm ) )
            {
                return TRUE;
            }
        }
    }

    return FALSE;
}

コモンコントロールにホイール関係の通知IDが無かったので WM_MOUSEWHEEL を渡したけど問題ないかな?
いま調べたら、NM_~ 系のIDはゼロからマイナス方向で定義されてるみたいなのでかぶることは無さそうなので安心すた。

以上です。