C# 如何在C语言中处理WM_SETCURSOR#

C# 如何在C语言中处理WM_SETCURSOR#,c#,winforms,wndproc,C#,Winforms,Wndproc,在我的媒体播放器应用程序中,我使用SetCursor(NULL)隐藏光标,为了确保Windows不会重置光标状态,我在WndProc方法中处理了WM_SetCursor protected override void WndProc(ref Message m) { switch (m.Msg) { case WM.SETCURSOR: base.WndProc(ref m); int lowWord = (m.LP

在我的媒体播放器应用程序中,我使用
SetCursor(NULL)
隐藏光标,为了确保Windows不会重置光标状态,我在
WndProc
方法中处理了
WM_SetCursor

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;
    }
}
受保护的覆盖无效WndProc(参考消息m)
{
开关(m.Msg)
{
case WM.SETCURSOR:
基准WndProc(参考m);
int lowWord=(m.LParam.ToInt32()>16;
if(lowWord==HTCLIENT&&FullScreen)
{
SetCursor(IntPtr.Zero);//隐藏光标
结果=(ItpTR)1;//true;C++中的等价物
}
返回;
}
}
但是,当光标位于客户端区域(也称为
LOWORD(lParam)=HTCLIENT
)时,
WM_SETCURSOR
WndProc
中从未触发过。因此,当光标位于客户端区域时,我从未真正收到
WM_SETCURSOR
消息,只有在
LOWORD(lParam)!=HTCLIENT
时才会收到它

但是在Spy++中,它清楚地显示应用程序收到了
WM_SETCURSOR
WM_MOUSEMOVE
消息


消息在哪里丢失/处理?我必须做什么才能在C#中接收
WM#u SETCURSOR
消息?

我的应用程序有几个面板覆盖了该应用程序。因此另一位用户友好地向我指出,由于每个控件都有自己的
WndProc
,因此
WM#u 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;
    }
}

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

我不知道答案。但是为什么你不能直接设置表单的光标?我不知道为什么它不能为你工作。我测试了一个简单的代码,它工作起来很有魅力。你确定
HTCLIENT=1
?看起来像这样吗e
Fullscreen
为假?您的代码应该可以工作,因为我已经测试过了。顺便说一句,您应该确保
WM_SETCURSOR=0x20
HTCLIENT=1
@King-Strange,当我在
case WM.SETCURSOR
之后的行上放置断点时,它在应用程序启动期间只会中断一次。之后,即使鼠标也不会中断e在表格顶部移动。