如何解决在Linux中,如何截获键盘输入并进行过滤?
我正在编写一个跨平台应用程序,我希望能够拦截键盘输入并有选择地将其过滤以使其无法到达其余应用程序。我的应用程序加载了插件,如果插件有焦点,我试图阻止击键进入插件的UI。
在Window上,我使用SetWindowsHookExA
;在macOS上,我使用[NSEvent addLocalMonitorForEventsMatchingMask:]
Linux是否等效?
解决方法
我正在编写一个跨平台应用程序,我希望能够拦截键盘输入
如果您的应用程序是GUI,请考虑使用跨平台框架,例如Qt或GTK(或FLTK,FOX等...)。 如果您的应用程序是命令行(例如grep或GCC或ninja或MongoDB),则访问键盘(如果在某些pipeline中使用),您还可以使用跨平台的框架,例如POCO。如果您的软件是通过crontab启动的,则它甚至都无法访问键盘,键盘甚至可能不存在或没有插入。
相同的源代码(适用于Qt或GTK或FLTK等)将适用于Linux和Windows。
顺便说一句,许多Linux计算机(例如,大多数Web服务器或RasperryPi)都没有键盘或鼠标。
有关更多信息,请阅读Advanced Linux Programming和syscalls(2)。
Linux上的我的应用程序加载了插件,如果插件有焦点,我试图阻止击键进入插件的UI。
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)(大约Xlib或event loop ...)正在等待此类消息。另请参见poll(2)。
在我的select(2)系统上(根据文件/var/log/Xorg.0.log
并使用time(7) ...),Xorg
服务器正在访问键盘(通过Debian)因为/dev/input/event1
和proc(5)客户端是udev与Xorg
服务器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。