首先,如果不对X.11输入进行某种黑客攻击,我甚至不确定这是否可能,但我看到的online的discussions让我认为这是可能的。
请允许我解释一下我希望做什么。我想要一个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);
}
发布于 2014-08-23 13:55:29
好了,这是我解决这个问题的方法。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);
}
}
https://stackoverflow.com/questions/25443236
复制相似问题