在Linux中,如何截获键盘输入并进行过滤?

问题描述

我正在编写一个跨平台应用程序,我希望能够拦截键盘输入并有选择地将其过滤以使其无法到达其余应用程序。我的应用程序加载了插件,如果插件有焦点,我试图阻止击键进入插件的UI。

在Window上,我使用SetWindowsHookExA;在macOS上,我使用[NSEvent addLocalMonitorForEventsMatchingMask:]

Linux是否等效?

解决方法

我正在编写一个跨平台应用程序,我希望能够拦截键盘输入

如果您的应用程序是GUI,请考虑使用跨平台框架,例如QtGTK(或FLTKFOX等...)。 如果您的应用程序是命令行(例如grepGCCninjaMongoDB),则访问键盘(如果在某些pipeline中使用),您还可以使用跨平台的框架,例如POCO。如果您的软件是通过crontab启动的,则它甚至都无法访问键盘,键盘甚至可能不存在或没有插入。

相同的源代码(适用于Qt或GTK或FLTK等)将适用于Linux和Windows。

顺便说一句,许多Linux计算机(例如,大多数Web服务器或RasperryPi)都没有键盘或鼠标。

有关更多信息,请阅读Advanced Linux Programmingsyscalls(2)

了解XorgWayland

我的应用程序加载了插件,如果插件有焦点,我试图阻止击键进入插件的UI。

Linux上的

Plugins通常通过dlopen(3)dlsym(3)实现为ELF共享对象,通常在名为*.so的文件中实现(因此请参见{{3} })。阅读elf(5),如果您用Program Library HowTo编码,也请阅读C++。如果您使用C++ dlopen minihowto进行编码,请使用Ocaml模块。如果您可以使用Dynlink进行编码(例如使用Common Lisp),则只需使用SBCL。如果您必须使用eval进行编码,请使用一些Java

使用Xorg(即class loader),每个键盘事件都会在X11或{{3}上发出一些定义明确的消息(一些XKeyEvent) },由Xorg服务器插入您的tcp(7)客户端应用程序。

在客户端(在GUI应用程序代码中),unix(7)(大约Xlibevent loop ...)正在等待此类消息。另请参见poll(2)

在我的select(2)系统上(根据文件/var/log/Xorg.0.log并使用time(7) ...),Xorg服务器正在访问键盘(通过Debian)因为/dev/input/event1proc(5)客户端是udevXorg服务器。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...