4

私のメディア プレーヤー アプリケーションでは、SetCursor(NULL)Windows がカーソルの状態をリセットしないようにするために、 を使用してカーソルを非表示WM_SETCURSORにし、WndProcメソッドで処理しました。

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM.SETCURSOR:
            base.WndProc(ref m);
            int lowWord = (m.LParam.ToInt32() << 16) >> 16;
            if (lowWord == HTCLIENT && FullScreen)
            {
                SetCursor(IntPtr.Zero); // hides cursor
                m.Result = (IntPtr)1; // return TRUE; equivalent in C++
            }
            return;
    }
}

ただし、カーソルがクライアント領域 (aka LOWORD(lParam) == HTCLIENT) にWM_SETCURSORある場合、 では決してトリガーされませんWndProcWM_SETCURSORしたがって、カーソルがクライアント領域にあるときにメッセージを実際に取得することはなく、 LOWORD(lParam) != HTCLIENT.

WM_SETCURSORただし、Spy++ では、アプリケーションがおよびWM_MOUSEMOVEメッセージを受信したことを明確に示しています。

メッセージはどこで紛失/処理されますか? WM_SETCURSORC# でメッセージを受信するにはどうすればよいですか?

4

1 に答える 1

1

私のアプリケーションには、アプリケーションをカバーするいくつかのパネルがあります。別のユーザーは、すべてのコントロールに独自のWndProcがあるため、WM_SETCURSORメソッドがその下のフォームに渡されていないことを親切に指摘してくれました。これらのメッセージを受け取るには、それぞれのパネルを独自のWndProcメソッドでオーバーライドする必要があります。

ただし、カーソルがあるフォームをカバーするコントロールがない場合、上記のコードは機能します。

于 2013-08-17T21:53:28.950 に答える