Articles of 键盘事件

需要拦截HID键盘事件(然后阻止它们)

我有一个注册为HID设备的RFID USB设备(或多或less的USB键盘)。 我正在寻找一种方法来捕获这个input,并在它碰到正常的键盘事件处理程序(并输出10位数的RFID代码到控制台)之前阻止/过滤它。 我当然必须专门捕捉这个设备,并保持真正的键盘input(或传递)。 我最初的想法是阻止UDEV中的设备(所以usbhid / event / kbd内核模块没有绑定到它),并写下我自己的这个设备的基本驱动程序 – 但我不知道从哪里开始,或者如果甚至会工作。 如果我写了一个事件filter模块,它可以与事件驱动程序一致并捕获(然后过滤)来自事件驱动程序的适当input,那么什么是好的(我不确定是否可以完成这样的事情) RFID单位,但让其他一切通过。 我想这样的模块不需要太多的代码,而且会是最实用的。 帮帮我? [编辑:我应该补充说,Xorg不安装 – 控制台] cat /proc/bus/input: I: Bus=0003 Vendor=0419 Product=0912 Version=0100 N: Name="NewRoad Sem. NewRoad System PS2 Interface" P: Phys=usb-0000:00:1d.3-2/input0 S: Sysfs=/devices/pci0000:00/0000:00:1d.3/usb5/5-2/5-2:1.0/input/input20 U: Uniq= H: Handlers=sysrq kbd mouse0 event3 B: PROP=0 B: EV=120017 B: KEY=70000 0 0 e080ffdf01cfffff fffffffffffffffe B: REL=103 […]

从Linuxinput设备访问密钥

我正在尝试做什么 所以,我一直在尝试访问Linux中的键盘input。 具体来说,我需要能够访问修改键的按下, 而不要按其他键。 此外,我希望能够在没有 X系统运行的情况下做到这一点。 所以,总之,我的要求是这样的: 在Linux上运行 不需要X11 无需按任何其他键即可检索修改器按键 这包括以下键: 转移 控制 Alt键 我所需要的只是一个简单的0 = not pressed , 1 = currently pressed让我知道键盘被选中时是否按住 我的电脑设置 我的普通Linux机器正在一辆卡车上,驶向我的新公寓。 所以,我现在只有一台Macbook Air。 因此,我在一台虚拟机上运行Linux来testing这个。 VirtualBox中的虚拟机 操作系统:Linux Mint 16 桌面环境:XFCE 以下的一切都是在这个环境下完成的 我已经尝试了X运行和其他ttys之一。 我的想法 如果有人能纠正我,我会改变这一点。 我已经做了相当一部分的阅读,意识到更高级别的库不提供这种function。 修改键与其他键一起使用以提供备用键码。 在Linux中通过高级库访问修饰键本身并不容易。 或者,我还没有在Linux上find这个高级的API。 我以为libtermkey会是答案,但它似乎并没有比普通的按键检索更好地支持Shift修饰键。 我也不确定它是否工作没有X. 在使用libtermkey的时候(之前我意识到在Shift-Return这种情况下没有变化),我打算编写一个守护进程来收集键盘事件。 运行守护进程程序的副本只需pipe理键盘数据的请求并接收键盘数据作为响应。 我可以使用这个设置在后台运行一些东西,以防在特定时间检查关键代码状态(必须在接收到关键代码时)。 下面是我写的一个可以从Linux键盘设备读取的程序的两次尝试。 我还包括我的小检查,以确保我有正确的设备。 尝试#1 我试图直接访问键盘设备,但遇到问题。 我已经在这里尝试了另一个堆栈溢出线程的build议。 它给了我一个分段错误; 所以,我把它从fopen改为打开: // … […]

在读取前冲洗/清除System.in(stdin)

在工作中,我们有5个RFID阅读器连接到运行Linux的个人电脑上。 读者都被识别为键盘,并将它们的input(他们从芯片上读取的内容)作为键input事件序列发送。 为了能够告诉哪个阅读器发送了什么序列,我正在对/dev/input/XX进行原始读取,并以这种方式得到它们的input。 问题在于,由RFID阅读器生成的发送键盘事件仍然是“in”stdin,当我试图通过Scanner从System.in读取(这次input应该由普通键盘生成)时,我首先从读取器(包含十个hex十进制数字和一个换行符( \n ))获得“挂起”input。 现在,问题是: 如何从标准input中清除所有这些“未决”input ,然后从键盘读取我真正想要的内容? 我试过了: System.in.skip(System.in.available()); 但是stdin不允许seek( skip抛出一个IOException )。 for (int i = 0; i < System.in.available(); i++){ System.in.read(); } 但available()不足够估计(之后仍然是stdin的东西)。 Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()){ scanner.nextLine(); } System.out.println("Clean!"); 但hasNextLine()永远不会成为false (打印从不执行)。 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = in.readLine()) != null); System.out.println("Clean!"); 同上。 任何人有更多的想法?

C ++控制台键盘事件

有什么办法可以在Windows控制台中获取关键事件? 我需要一种方法来快速获得keydown和keyup事件,而不需要GUI。 我已经尝试过使用getch(),但是它没有得到keyups并等到一个键被按下才返回。

Ruby键盘事件处理

你好,我用curses来开发一个小的控制台应用程序。 我有一个主循环部分等待用户input,它使用getstr函数,当然这个等待用户按回车。 我想捕捉上下和选项卡的按键。 我想这不能用getstr来完成。 任何人有任何想法如何做到这一点? 编辑:我已经尝试使用STDIN.getc这将阻止应用程序运行,getch不捕获箭头键 编辑#2:即时通讯在Windows上尝试此代码。 似乎Curses.getch适用于Linux,但在Windows上,我没有得到向上箭头发送的密钥。

不能中断lock.acquire(),而我可以中断time.sleep()

在Windows中,Python 3.4 import threading l = threading.Lock() l.acquire() l.acquire() 触发死锁,并且CTRL + C无法停止它。 你必须杀死这个过程。 另一方面: import time time.sleep(100000) 可以随时用CTRL + C中断(我已经读过其他一些SO问题/答案,但它工作正常) 两个都依靠OS系统调用,所以为什么它不适用于锁,它正在sleep ? 是因为time.sleep(1000000)是(大致)等于for i in range(10000000): time.sleep(0.1) ,因此可以很好地中断吗?

当subprocess运行时更好的方法来中断我的Python代码?

我最近在这里回答了一个问题 问题是:如何在subprocess运行时中断python脚本(可能是windows特定的)。 我build议创build一个线程来运行subprocess,并等待主循环中的CTRL + C / KeyboardInterruptexception,以便subprocess可以被终止。 它的工作原理,但一点点,因为我这样做:基本上,我做一个非CPU活动(但轮询)循环等待100毫秒,然后检查共享布尔值done 。 如果subprocess退出,线程集done 。 如果CTRL + C被按下,主进程进入exception处理程序并杀死进程。 … t = threading.Thread(target=s) t.start() try: while not done: time.sleep(0.1) except KeyboardInterrupt: print("terminated") proc.terminate() … 我想改善它使用线程锁。 所以我重写了它,看起来干净,没有太多的共享variables,没有更多的时间循环,看起来很理想,除了…这是行不通的。 CTRL + C在主循环的lock.acquire()中没有响应。 import subprocess import threading import time binary_path = 'notepad' args = 'foo.txt' # arbitrary proc = None lock = threading.Lock() def […]

当应用程序是服务时,SetWinEventHookcallback不起作用

我有一个在.NET 4.0中制作的应用程序挂钩赢得事件,并使用callback来捕获窗口事件,如下所示: //import the methos from the dll [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr SetWinEventHook(int eventMin, int eventMax, IntPtr hmodWinEventProc, WinEventProc lpfnWinEventProc, int idProcess, int idThread, int dwflags); //declare a callback public static WinEventProc _winEventProc = new WinEventProc(WindowEventCallback); //pass this callback to SetWinEventHook SetWinEventHook( EVENT_SYSTEM_FOREGROUND, // eventMin EVENT_SYSTEM_FOREGROUND, // eventMax IntPtr.Zero, // hmodWinEventProc […]

如何在Swing中停止重复的keyPressed()/ keyReleased()事件

所以我遇到的问题似乎是只在Linux上发生的错误。 我试图让我的挥杆应用程序logging,当一个键被按下,然后检测到该键被释放。 现在,不应该有问题,因为KeyListener应该为我处理。 问题是,当我按住键时,我得到了很多重复的keyPressed()/ keyReleased()事件,而不是只有一个keypressed()。 有没有人有一个解决scheme或解决方法知道什么时候一个密钥是真的在Linux上发布? 谢谢。