我正在编写一个用C ++编写的程序,用于在运行Linux发行版的MacBook Pro上实现OS X的键盘背光功能。到目前为止,它在开机时打开背光,如果20秒内没有注册键盘和鼠标事件,它会将其关闭,当然在注册事件时再打开它。我需要该程序做的下一件事是捕获键盘背光/向上/向下键上的按键,但我不知道如何处理它。
我目前正在使用XScreenSaverQueryInfo来获取键盘和鼠标事件的空闲时间,因此使用X11 API的方法是可以的。我做了很多谷歌搜索,但没有找到一种方式,我觉得肯定会一起去。我用很多方法看到的问题是,他们使用keycode来识别密钥,但我认为这不是一个可行的解决方案,因为该程序适用于任何可用的键盘布局。
我应该采用哪种方法和API?哪种方法效果最好?
此致
答案 0 :(得分:2)
如果你还没有这样做,请熟悉xev。启动它,给它焦点,然后按键,看看发生了什么。
答案 1 :(得分:2)
执行此操作的常规方法是使用XGrabKey()。它使用密钥代码,但您不会对密码进行硬编码,您可以使用XKeysymToKeycode()获取密钥代码。更正确的是,当你获得MappingNotify(XMappingEvent)时,你也想要重做抓取。 (注意,MappingNotify,不是 MapNotify。)如果没有这些键的键盘 - 可能没有旧的X版本,但希望更新的X.org版本有一个 - 那么你只需要必须硬连线键码。这将不是非常强大或可移植,但可能适用于具有相同硬件模型的Linux上的每个人。
准备好关键抓取是全局的,所以如果你尝试XGrabKey()并且其他东西已经抓住了那个键,你将得到一个X错误 - 默认情况下退出程序。 XGrabKey()的另一个怪癖是它使用精确的修改器集来抓取键。例如,要处理NumLock和不使用NumLock,您需要抓取两次。见Global Hotkey with X11/Xlib
在正常的Linux设置中(如果你想在上游项目中获得这样的功能),桌面环境不希望有很多单独的应用程序争夺关键争夺并获得错误。因此会有一些中心协调点,例如窗口管理器或特殊守护程序可能会根据需要执行所有键绑定和转发命令到其他进程。因此,如果您在默认情况下尝试将功能集成到分发中,那么您可能希望查看修补处理其他特殊键的相同上游代码。
需要注意的另一件事是Xkb API,它要复杂得多。使用Xkb抓取钥匙有一些大脑弯曲的方法,但我不知道走这条路有什么好处。