【发布时间】:2020-10-18 18:48:15
【问题描述】:
我需要跟踪屏幕上的光标位置,为此我使用了 WinAPI 中的函数
// code from Qt(!) project
#include <windows.h>
#pragma comment(lib, "user32.lib")
MyClass *myclass;
static HHOOK hHook;
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
switch( wParam )
{
case WM_MOUSEMOVE:
POINT p;
GetCursorPos(&p);
myclass->setState(QPoint(p.x,p.y),myclass->getParent()); // setCursor
break;
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
//in the class constructor
hHook = (HHOOK) ::SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)MouseProc, GetModuleHandle(0),0) ;
这可行,但有时程序在退出时崩溃。如果注释掉最后一行,程序永远不会崩溃,但不会跟踪鼠标。我不知道WinApi,所以错误可能很明显
编辑 1:
我知道如何获取坐标,但问题是如果使用 WinAPI,程序退出后会崩溃
编辑 2: 谢谢Nurav,错误是这样,点击后我删除了应用程序,如果移动鼠标,就会调用这个函数,这里我指的是窗口的子窗口
【问题讨论】:
-
我们需要查看minimal reproducible example 才能了解发生了什么。 “崩溃” 可能与您发布的代码无关。您仍然需要删除那些 C 风格的演员表;您的代码应该在没有它们的情况下编译。如果没有,那么您刚刚发现了一个错误。
-
@IInspectable 查看更改
-
这仍然是完全不透明的信息,通过查看问题不可能看到。这不是我们所期望的minimal reproducible example。另外,请不要接受不能回答您问题的答案。未来的访问者将依靠您接受的答案来实际解决问题。 This one 没有。
-
在
case WM_MOUSEMOVE:内,我想在我的ui 中的文本框中打印我的mouse is moving,但我不能这样做,因为我的MouseProc function是静态的,无法打印访问非静态成员。我可以以任何方式使用ui->textbox->append("mouse is moving")