簡體   English   中英

Qt在應用程序窗口之外獲取鼠標事件

[英]Qt get mouse events outside of the application window

首先,我不確定這是否可能沒有X.11輸入的某種黑客攻擊,但我在網上看到的討論使我認為這是可能的。

請允許我解釋一下我希望做的事情。 我想要一個Qt應用程序,它很可能只是一個小窗口,在屏幕上有點像小部件。 在用戶將另一個應用程序窗口拖到其頂部之前,應用程序不執行任何操作。 我希望檢測到這一點的方法是跟蹤鼠標,看看左鍵是否向下,鼠標是否在Qt窗口上,而Qt不是活動窗口,然后執行一些操作。 但是,當我的Qt應用程序不是活動窗口時,我當前無法獲得鼠標事件。 我認為我鏈接的一些帖子在QApp中將'window'稱為QWindow。

我的意思是窗口然而是一個X.11窗口,任何在X中打開的應用程序。我的截圖我希望突出我當前的困境。 我也附上了我的代碼,很樂意接受任何建議。 任何其他已知可以幫助我實現這一目標的黑客我也很感激被告知。

狀態1

紅色顯示我的光標所在的位置,鼠標事件記錄在Qt窗口之外。 這是由'FocusOut'事件觸發的,但是我設法檢測到的最后一個事件。

州2

正如我們在控制台中看到的那樣,鼠標已移動但未捕獲任何事件。 我真的想要檢測鼠標何時越過Qt App Window所處的位置,無論它是否在另一個窗口的頂部。

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
    {
      if (event->type() == QEvent::MouseMove)
      {
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
    statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(mouseEvent->pos().x()).arg(mouseEvent->pos().y()));
    qDebug() << QString::number(mouseEvent->pos().x());
    qDebug() << QString::number(mouseEvent->pos().y());
  }
  if (event->type() == QEvent::FocusOut)
 {
     QFocusEvent *focusEvent = static_cast<QFocusEvent*>(event);
     focusEvent->accept();
     qDebug()<<"event Filter Mouse Move111"<<QCursor::pos();
 }
  return false;
}


void MainWindow::initWindow()
{
    //Makes the window frameless and always on top
    //setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
    //Makes the window transparent
    //setAttribute(Qt::WA_TranslucentBackground);


    //Allows 'mouseMoved' events to be sent, not sure yet if this will be useful, I think we want mouseDragged
    setMouseTracking(true);
    grabMouse();

    //setup this as an event filter for mouse events
    qApp->installEventFilter(this);
}

好吧,我是如何解決這個問題的。 Qt中的事件系統,我假設的任何應用程序,都不會在窗口未激活時注冊事件。 但是,該過程顯然仍在運行,因此您可以在窗口處於活動狀態時訪問的數據可以在窗口不再處於活動狀態時訪問。

使用定時輪詢方法每n秒獲取鼠標位置

//Method used to hopefully track the mouse regardless of whether or not it is inside the active window
void MainWindow::pollMouse(unsigned long sec)
{
    //Loop forever
    while ( true )
    {
        QPoint mouseLoc = QCursor::pos();
        qDebug() << "Mouse position global: x,y"  << mouseLoc.x() << mouseLoc.y();

        QThread::sleep(sec);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM