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;
    }
}

但是,当光标位于客户区(又名LOWORD(lParam) == HTCLIENT)时,WM_SETCURSOR永远不会在WndProc. 所以当光标在客户区时我从来没有真正得到WM_SETCURSOR消息,只有在LOWORD(lParam) != HTCLIENT.

但是在 Spy++ 中,它清楚地表明应用程序收到了WM_SETCURSORWM_MOUSEMOVE消息。

消息在哪里丢失/处理?WM_SETCURSOR为了在 C#中接收消息,我必须做什么?

4

1 回答 1

1

我的应用程序有几个面板覆盖该应用程序。所以另一位用户好心地向我指出,由于每个控件都有自己的WndProc,因此该WM_SETCURSOR方法没有被传递给它下面的表单。为了接收这些消息,我必须用自己的WndProc方法覆盖每个面板。

但是,如果没有控件覆盖光标所在的表单,则上述代码确实有效。

于 2013-08-17T21:53:28.950 回答