PostMessage发送WM_LBUTTONDOWN消息给QT窗口无效



  • 大家好, 遇到一个问题请教一下:
    向qt app的窗口发送消息, 模拟鼠标点击, 没有效果, 代码如下:

    void SimuClick(HWND hwnd, int x, int y)
    {
        LPARAM point = MAKELPARAM(x, y);
        ::PostMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, point);
        ::PostMessage(hwnd, WM_LBUTTONUP, 0, point);
    }
    

    如果遇到相似问题, 并有解决办法, 请不吝赐教, 谢谢!



  • 可以不用Windows原生的事件。直接使用Qt的Qt Test就可以模拟点击。看看Qt的帮助文档吧。



  • 非常感谢, 我改为以下的代码, 但是依然没有效果:

    
    void SimuClick(HWND hwnd, int x, int y)
    {
    	SetForegroundWindow(hwnd);
    	QWindow *wnd = QWindow::fromWinId((WId)hwnd);
    	if (wnd != nullptr) {
    		QTest::mouseClick(wnd, Qt::MouseButton::LeftButton, Qt::KeyboardModifiers(), QPoint(x, y));
    		return;
    	}
    }
    

    可以确认, hwnd没有问题, 并且QWindow::fromWindId也返回了一个QWindow。 x,y坐标和在spy++里面看到的一样。

    参数没有错误, 就是没有效果。



  • @jiancaiyang 我又做了实验, 自己用qt creator创建的窗口, 用PostMessage是可以点击成功的。
    难道现在无法实现模拟点击的app使用了什么特殊的办法来过滤掉模拟点击?



  • 最好不要用平台相关的本来Qt是跨平台的应用程序框架所以最好你制作的是跨平台的应用程序。



  • @jiancaiyang QTest::mouseClick也无效。。。



  • 问题已找到, 由于windows 10的uipi保护的问题, 目标进程的级别高于我的程序, 所以PostMessage失败了, GetLastError返回ERROR_ACCESS_DENIED。 解决办法需要提高自己的级别, menifest文件中设置uiAccess=true。


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.