鍍金池/ 問答/Python  C++  Office/ 如何利用QT實現(xiàn)模擬鼠標(biāo)點擊?

如何利用QT實現(xiàn)模擬鼠標(biāo)點擊?

QT入門,windows開發(fā)入門選手。

我想利用QT實現(xiàn)一個模擬鼠標(biāo)點擊的功能(Windows平臺),具體來說是這樣的:首先獲取某個特定名稱窗口的句柄,然后再模擬單擊這個窗口的特定位置,并且要求窗口可以不在桌面最前方顯示(即是虛擬的點擊,而不是把鼠標(biāo)指針移到那個位置再點擊)

根據(jù)網(wǎng)上的內(nèi)容我寫了一個簡單的SLOT函數(shù),如下:

void MainWindow::clickTest()
{
    HWND hwndGameWindow=::FindWindow(NULL,L"窗口名稱");
    gameWindow=QWidget::find((WId)hwndGameWindow);
    qDebug()<<(QString)(gameWindow->windowTitle());
    QPoint *pos=new QPoint(112,83);
    QMouseEvent *clickEvent=new QMouseEvent(QEvent::MouseButtonPress,*pos,Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);
    QApplication::sendEvent(gameWindow,clickEvent);
}

當(dāng)我觸發(fā)這個槽函數(shù)的時候,系統(tǒng)報段錯誤,程序強制退出。
請教各位錯誤出在哪?若能再給出實現(xiàn)我所描述功能的方法,不勝感激。

回答
編輯回答
朽鹿

QWidget::find() 僅適用于 Qt 當(dāng)前進程創(chuàng)建的窗口,而 FindWindow() 查詢的是整個操作系統(tǒng)下的頂級窗口。
因此,你若傳遞非 Qt 當(dāng)前進程創(chuàng)建的窗口 ID 給 QWidget::find(),它將返回 NULL。

要給其他進程的窗口發(fā)送消息,大致流程是這樣的

  1. FindWindow 找到目標(biāo)窗口的頂級窗口
  2. 在頂級窗口下,用 FindWindowEx 找到目標(biāo)窗口
  3. 構(gòu)造需要發(fā)送的消息
  4. SendMessagePostMessage 向目標(biāo)窗口發(fā)送消息
2018年8月29日 15:09
編輯回答
晚風(fēng)眠

單步看看前面步驟是否找了空指針啊之類的

2017年7月21日 10:35