【发布时间】:2021-10-13 05:25:07
【问题描述】:
在我一直在开发的程序中,我想独立于我关注的任何窗口读取键盘击键(因此,无论我关注的是 Firefox 还是玩 Minecraft,相同的程序都可以工作,无需改变焦点)。到目前为止,使用 linux/input.h 库并从 /dev/input/event5 读取似乎工作得很好。
fd = open(argv[1], O_RDONLY);
struct input_event ev;
int len = read(fd, &ev, sizeof(struct input_event));
但是,我想添加的一项功能是在程序运行时取消此输入,以防止我的击键到达 Firefox 或 Minecraft 或通用操作系统。有什么好办法吗?
【问题讨论】:
-
这是XY problem? 破坏操作系统是一个非常激进的解决方案。
-
可能是。我已经四处寻找一种解决方案,它可以让我捕获键盘输入而不依赖于专用窗口成为焦点,并且仅捕获原始输入事件似乎是最简单的。我确实尝试了 pynput 模块,但这往往会导致我的桌面环境在安装时随机崩溃,所以我自己滚动。
-
理想情况下,不会取消所有键盘输入,只需输入我认为对我的程序有用的输入(几乎只是字母/数字键、空格和回车/esc 键,我用来关闭程序)。此外,程序只会在触发时运行(此时,通过自动键热键),因此操作系统会在最短的时间内瘫痪。
-
在 Windows API 中,我使用
SetWindowsHookEx()来查看键盘事件,但没有试图干扰它们。好吧,不在那里,我已经生成了事件,就好像它们来自带有SendInput()的键盘,但它们转到具有焦点的进程(也可以被操纵)。 -
不过,根据rediculousanddirtyprogramming,如果您真的想要,SetWindowsHookEx 可以 用于此目的。不幸的是,我使用的是 Linux(尽管如果我想将我的应用程序移植到 Windows,这可能很有用)。