首先,我不确定如果不对 X.11 输入进行某种黑客攻击,这是否可行,但 discussions我见过online让我觉得这是可能的。
请允许我解释一下我希望做什么。我想要一个 Qt 应用程序,它很可能只是一个小窗口,位于屏幕的一侧,有点像一个小部件。在用户将另一个应用程序窗口拖到它上面之前,应用程序什么都不做。我希望检测到这一点的方法是跟踪鼠标并查看左键单击是否按下并且鼠标是否在 Qt 窗口上方并且 Qt 不是事件窗口然后执行一些操作。但是,当我的 Qt 应用程序不是事件窗口时,目前我无法获取鼠标事件。我认为我链接的其中一些帖子将“窗口”称为 QApp 内的 QWindow。
然而,我所说的窗口是 X.11 窗口,任何在 X 中打开的应用程序。我希望我的屏幕截图能突出我当前的困境。我也附上了我的代码,很乐意接受任何建议。任何其他已知的可以帮助我实现这一目标的技巧,我也很高兴被告知。
红色显示我的光标点击的位置,鼠标事件记录在 Qt 窗口之外。然而,这是由“FocusOut”事件触发的,也是我设法检测到的最后一个事件。
正如我们在控制台中看到的,鼠标已经移动但没有捕获到任何事件。我真的很想检测鼠标何时越过 Qt 应用程序窗口所在的位置,无论它是否在另一个窗口的顶部。
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);
}
}
关于c++ - Qt获取应用程序窗口外的鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25443236/