我正在编写一个非常简单的程序,将鼠标剪辑到指定的窗口。它从系统托盘运行,没有可见的窗口。因为同一窗口将有多个实例,所以它使用EnumWindows()遍历每个顶级窗口,并将它们的hwnd与GetForegroundWindow()进行比较。为true时,它将运行标准ClipCursor()代码。 ClipCursor()返回TRUE,并且我断言RECT设置的GetClipCursor()与传递给RECTClipCursor()完全相同。但是,光标可以自由移动到屏幕上的任何位置。

我检查了RECT中的值是否是窗口的确切值,我已经在 Release模式下编译了程序,并以管理员权限运行了该程序,但仍然没有执行任何操作。下面的代码正是在我们找到HWNDGetForegroundWindow()之后运行的代码:

// 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()),但是此代码肯定在应有的情况下正在运行。光标只是没有被剪切,我无法理解为什么。

最佳答案

由于游标是共享资源,因此其他任何调用ClipCursor取消游标的尝试都会覆盖您对其进行剪辑的尝试。并且许多操作会自动使光标松开(例如任何焦点更改)。背景窗口更改光标剪辑的形式很差。

关于winapi - ClipCursor成功,但实际上无能为力,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12015200/

10-13 09:30