Windows ClipCursor不工作

Windows ClipCursor不工作,windows,visual-c++,cursor,directx-11,Windows,Visual C++,Cursor,Directx 11,我正在开发一个DX11游戏,我想在全屏模式下将光标剪辑到全屏窗口。我用这个方法 void MyClass::_SetupCursor( BOOL bFullscreen ) { // Clip cursor if requested if( bFullscreen ) { if(m_bShowCursorWhenFullscreen) { ShowCursor(m_bShowCursorWhenFullscreen); }

我正在开发一个DX11游戏,我想在全屏模式下将光标剪辑到全屏窗口。我用这个方法


void MyClass::_SetupCursor( BOOL bFullscreen ) {
    // Clip cursor if requested
    if( bFullscreen ) {
        if(m_bShowCursorWhenFullscreen) {
            ShowCursor(m_bShowCursorWhenFullscreen);
        }
        if(m_bClipCursorWhenFullscreen) {
            // Confine cursor to full screen window
            RECT windowRect;
            GetWindowRect( m_hWnd, &windowRect );
            ClipCursor( &windowRect );
        }
    }
    else {
        ShowCursor( TRUE );
        ClipCursor( NULL );
    }
}
但是,当我在全屏模式下使用2台显示器时,我仍然可以将鼠标移到另一台显示器上。在全屏模式下分辨率设置为2048x1152时,我得到的窗口矩形为1360x768,这就是它被剪裁的位置。我确认已使用GetClippedRect对其进行剪裁

所以我有两个问题:

1) 为什么鼠标没有被夹到我的窗口所在的显示器上


2) 当我知道显示器是2048x1152,并且分辨率设置为2048x1152时,为什么窗口矩形的测量值为1360x768?

不幸的是,根据(用户)的评论,这似乎不适用于多显示器设置。您可能希望开发一种方法,在鼠标离开屏幕时重新定位鼠标,关闭其渲染,然后在将光标移回窗口时重新打开鼠标(要检测鼠标是否离开窗口,会有相应的窗口消息)。

结果是,如果ClipCursor能够工作,您必须拥有所有DX11缓冲区和正确的窗口大小。我首先通过全屏运行我的应用程序发现了这一点,没有切换到它,ClipCursor工作得很好,即使有多个监视器。有关ClipCursor何时失败的更多信息,请查看我关于stackoverflow的另一个问题:


每当我在这个问题中描述的情况出现时,ClipCursor就会失败。另外,在回答我的第二个问题时,由于我在链接问题中描述的情况,窗口大小不正确

为什么你要剪掉光标而不是隐藏它?@CodyGray如果光标没有剪掉,隐藏它是没有意义的。。。我需要光标停留在全屏窗口中。很多游戏都有这个功能,是的,我知道他们隐藏了windows光标,但他们用自己的光标替换了它,所以这真的没有什么不同。我只是还没有替换游标。请完全避免此函数调用-您应该真正模拟您自己的游标。原因是,如果您的应用程序不干净地退出(segfault/exception/access invalition/whatever),Windows将保留剪辑边界(至少@JonathanDickinson我理解你的担忧。我的游戏只有Win7,只有DX11,所以没有XP方面的担忧。但是,SetCursorPos是一个可行的选择。@Darkhydro只是一个实验-我这么说是因为这是我最后一次使用它;它可能仍然存在于Vista\Win7中。制作一个简单的应用程序,在一个按钮上直接崩溃单击并约束光标。此外,用户如何移动您的窗口以及如果移动窗口会发生什么。这太复杂了。我不太愿意接受这一点,因为我看到的一些DX11示例即使使用多个监视器也能正确地剪裁光标。此外,没有说multimon不支持它。DX11示例使用了额外的api(DXUT)这可能是用ClipCursor以外的东西剪切光标。也许他们正在做其他事情?不,我正在做DXUT正在做的事情。感谢帮助,我发现这是我遇到的另一个问题的一部分,也是stackoverflow@。我将删除此问题,因为它与d无关o使用ClipCursor-ClipCursor工作正常。如果解决方案是相关的,也许您可以在此处发布解决方案并接受您自己的答案。这样会使其他人受益。