【发布时间】:2021-07-31 16:02:22
【问题描述】:
我正在 Qt5.15 中创建一个跨平台应用程序来监控用户活动。我的代码在 Windows、Mac 和 Raspberry Pi-Desktop-version(Debian) 中运行良好,但在涉及 ubuntu 键盘事件和鼠标单击事件时不起作用。请注意,我的应用程序在用户工作时在后台运行。
#define MOUSEFILE "/dev/input/event4"
#define MOUSEMOVEFILE "/dev/input/js1"
#define KEYBOARDFILE "/dev/input/event0"
包含头文件
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/input-event-codes.h>
#include <fcntl.h>
对于键盘事件代码
class KeyboardHook:public QThread
{
Q_OBJECT
void run() override
{
int fd;
struct input_event ie;
if((fd=open(KEYBOARDFILE,O_RDONLY))==-1)
{
//qDebug()<<"opening device";
exit (EXIT_FAILURE);
}
while(read(fd,&ie,sizeof(struct input_event)))
{
// qDebug()<<"Keyboard Activity";
if(ie.code==EV_KEY)
{
DateAndTime::s_previousActivity=QDateTime::currentDateTime();
GlobalHook::timeNow.start();
}
msleep(500);
}
}
};
但是鼠标移动是有效的。代码相同,唯一不同的是 KEYBOARDFILE 替换为 MOUSEMOVEFILE 并且不使用下面的 if 语句
if(ie.code==EV_KEY)
如果我不使用上述检查键盘,我会得到持续的键盘活动,即使键盘没有被触摸。
以上代码在 Debian 中正常运行。
打字时
ls -la /dev/input/by-id and ls -la /dev/input/by-path
我的 ubantu 安装在 virtual-box 中
【问题讨论】:
-
您需要发布指向完整代码集的链接。什么版本的 Ubuntu? 20.04 的存储库中只有 Qt 5.12.8。 Debian Qt 维护者退出了,所以目前 Debian 家族中不会有未来的 Qt 更新。我问是因为如果您从头开始构建 Qt 5.15,您可能会在配置时引入问题。我打算在 20.04 LTS 下的 5.12 上构建你的东西,看看它是否有效,然后在 Manjaro 上尝试。 Manjaro 有 5.15.2,我已经设置了一台机器。如果您运行的是较新的 Ubuntu,我必须进行设置以帮助您。
-
在我的 Ubuntu 笔记本电脑(Focal)上,
event0是盖子。当您输入ls -la /dev/input/by-id时,您会看到什么?还有ls -la /dev/input/by-path? -
@alle_meije 问题已编辑,我尝试从 event0 到 event12 但没有运气
-
不确定,也许stackoverflow.com/questions/29678011 的代码可以让您找到正确的号码?
-
为什么要在后台监控用户?那不是脏东西吗?隐私?