所以,我一直在尝试在Linux中访问键盘输入.具体来说,我需要能够访问修改键按下而不按下其他键.此外,我希望能够在没有运行X系统的情况下执行此操作.
所以,简而言之,我的要求是:
0 = not pressed,1 = currently pressed让我知道在检查键盘时是否按下了键我正常的Linux机器在我的新公寓的卡车上; 所以,我现在只有Macbook Air可以使用.因此,我在VM中运行Linux来测试它.
VirtualBox中的虚拟机
以下所有内容都是在这种环境下完成的.我已经尝试过使用X运行和其他一个ttys.
如果有人可以纠正我,我会改变这个.
我已经做了一些阅读,意识到更高级别的库不提供这种功能.修饰符键与其他键一起使用以提供备用键代码.通过Linux中的高级库访问修饰键本身并不容易.或者说,我还没有在Linux上找到高级API.
我认为libtermkey就是答案,但它似乎不支持Shift修饰键,比普通键击检索更好.我也不确定它是否可以在没有X的情况下工作.
在使用libtermkey时(在我意识到它没有像Shift-Return这样的情况下发生转变之前),我正计划编写一个可以运行以收集键盘事件的守护进程.运行守护程序的副本只会管理键盘数据请求并接收键盘数据作为响应.我可以使用此设置在后台运行某些内容,以防我无法在特定时间检查密钥代码状态(必须在发生时接收密钥代码).
下面是我尝试编写一个可以从Linux键盘设备读取的程序.我还包括我的小支票,以确保我有合适的设备.
我试图直接访问键盘设备,但遇到了问题.我在这里尝试了另一个Stack Overflow线程中的建议.它给了我一个分段错误; 所以,我把它从fopen改为open:
// ...
int fd;
fd = open("/dev/input/by-path/platform-i8042-serio-0-event-kbd", O_RDONLY);
char key_map[KEY_MAX/8 + 1];
memset(key_map, 0, sizeof(key_map));
ioctl(fd, EVIOCGKEY(sizeof key_map), key_map);
// ...
Run Code Online (Sandbox Code Playgroud)
虽然没有分段错误,但没有任何按键的指示(不仅仅是修改键).我测试了这个:
./foo && echo "TRUE" …Run Code Online (Sandbox Code Playgroud) 当试图通过sbt "++2.11.6 publishLocal"或发布我的项目的jar时,我sbt +publishLocal在发布Scala 2.11.6时会遇到Scaladoc问题.看来我的@throws标签导致链接无效.我不知道为什么我有无效的链接,也不知道为什么在我的交叉发布期间Scala 2.11.6只出现错误而Scala 2.10.5出错.我找不到任何迹象表明@throwsScala 2.11上不支持该标记; 所以,我认为这是我的Scaladoc的一个问题,但我不知道我在这一点上缺少什么.谁能让我对这个问题有所了解?
/**
* Attempts to load the JDI, asserting that it can be and is loaded.
*
* @throws AssertionError If failed to load the JDI
*/
@throws(classOf[AssertionError])
protected def assertJdiLoaded(): Unit =
assert(jdiLoader.tryLoadJdi(),
"""
|Unable to load Java Debugger Interface! This is part of tools.jar
|provided by OpenJDK/Oracle JDK and is the core of the debugger! Please
|make sure that JAVA_HOME has been …Run Code Online (Sandbox Code Playgroud)