我正在编写一个非常简单的程序来将鼠标剪辑到指定的窗口。它从系统托盘运行,没有可见窗口。因为同一个窗口会有多个实例,所以它EnumWindows()
会遍历每个顶级窗口并将它们的 hwnd 与GetForegroundWindow()
. 如果为真,它将运行标准ClipCursor()
代码。 ClipCursor()
返回TRUE
,并且,我断言RECT
set by与传递给GetClipCursor()
完全相同。然而,光标可以在屏幕上的任意位置自由移动。RECT
ClipCursor()
我检查RECT
了窗口中的值是否是窗口的确切值,我已经在发布模式下编译了程序并以管理员权限运行它,仍然没有。下面的代码正是在我们找到 之后运行HWND
的GetForegroundWindow()
:
// Get the window client area.
GetClientRect(hwnd, &rc);
// Convert the client area to screen coordinates.
POINT pt = { rc.left, rc.top };
POINT pt2 = { rc.right, rc.bottom };
ClientToScreen(hwnd, &pt);
ClientToScreen(hwnd, &pt2);
SetRect(&rc, pt.x, pt.y, pt2.x, pt2.y);
clipped = true;
ClipCursor(&rc);
RECT rect;
GetClipCursor(&rect);
assert(rect.bottom == rc.bottom);
assert(rect.left == rc.left);
assert(rect.right == rc.right);
assert(rect.top == rc.top);
我已经删除了很多检查,因为它们变得很烦人(我使用的是MessageBox()
's),但是这段代码肯定会在它应该运行的时候运行。光标只是没有被剪裁,我无法理解为什么。