如何在C#中处理WM_SETCURSOR

时间:2013-08-16 18:30:37

标签: c# winforms wndproc

在我的媒体播放器应用程序中,我使用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消息。

邮件丢失/处理在哪里?为了在C#中收到WM_SETCURSOR消息,我该怎么做?

1 个答案:

答案 0 :(得分:0)

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

但是,如果没有控件覆盖光标所在的表单,则上述代码可以正常工作。