【问题标题】:Qt with WinAPI MouseProcQt 与 WinAPI MouseProc
【发布时间】: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-&gt;textbox-&gt;append("mouse is moving")

标签: c++ qt winapi


【解决方案1】:

您可以为此使用GetCursorPos() 函数:

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
    switch(wParam)
    {
    case WM_MOUSEMOVE:
        POINT p;
        GetCursorPos(&p);
        sprintf(msgbuf, "My coordinates is (%d,%d)\n", p.x,p.y);
        OutputDebugString(msgbuf);
        break;
    }
}

您可以阅读更多关于它的信息here。 编辑1:

如果是自己的win32窗口,这是一个可行的方案。但是如果是另外一个窗口就不能用这个了!

【讨论】:

  • 当然,一个可以做到这一点。但这会导致一个您尚未回答的问题:何时您应该致电GetCursorPos?只要有要处理的输入,低级鼠标钩子就会调用您的钩子过程。您如何将这种行为纳入您提出的解决方案?
  • @Nurav 看到变化
  • 如果你想监视鼠标在窗口上的移动,根本不需要调用GetCursorPosWM_MOUSEMOVE 消息已将坐标传递给您。在极少数情况下您确实需要屏幕空间中的坐标,只需调用ClientToScreen
  • @Artem072 退出程序前要松开鼠标钩吗?
  • @Artem072 见UnhookWindowsHookEx()
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2010-09-30
  • 1970-01-01
  • 2019-07-31
相关资源
最近更新 更多