【发布时间】:2021-09-14 09:05:17
【问题描述】:
我正在编写一个非常简单的程序来将鼠标剪辑到指定的窗口。它从系统托盘运行,没有可见窗口。因为同一个窗口会有多个实例,所以它使用EnumWindows() 遍历每个顶级窗口并将它们的hwnd 与GetForegroundWindow() 进行比较。如果为真,它会运行标准的ClipCursor() 代码。 ClipCursor() 返回TRUE,并且我断言GetClipCursor() 设置的RECT 与传递给ClipCursor() 的RECT 完全相同。然而,光标可以在屏幕上任意移动。
我已经检查了RECT 中的值是窗口的确切值,我已经在发布模式下编译了程序并以管理员权限运行它,仍然没有。下面的代码正是我们找到GetForegroundWindow() 的HWND 之后运行的代码:
// 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),但是这段代码肯定会在它应该运行的时候运行。光标没有被剪断,我无法理解为什么。
【问题讨论】:
-
您正在剪辑的窗口是否在同一进程中?我不确定,但如果您不能在其他进程中剪辑光标,我不会感到惊讶。
-
光标是共享资源,因此任何进程都可以对其进行剪辑(您不是将其剪辑到进程,而是屏幕上的一个矩形。)
标签: winapi