我想在普通键盘上实现键合,我想我使用的是pythonxlib。 这项计划只允许他们在全球范围内进行。在
我现在的测试只是抓住了“1”键。如果按下此键,它将调用一个处理程序,该处理程序通过将“x”发送到聚焦窗口xtest.fake_输入. 因为我只抓到“1”键,应该不会有问题吧? 但不知怎么的,处理程序又被调用了,因为“x”被按下了。事实上,当我输入“1”时,程序正在监听所有键。 这可能和打电话有关
display.allow_events(X.Replaykeyboard, X.CurrentTime)
在处理完一个事件之后,但如果我不这样做,一切都会冻结。在
对于最终的程序来说,监听行为的改变并不是真正相关的,但是我必须能够区分假事件和用户事件。要做到这一点,我只是快速前进display.next_事件(),但这并不理想,因为用户可能会在那个时候输入,然后这些击键就会丢失。在
我尝试在发送和清空eventqueue时释放keygrab
^{pr2}$但那没用。在
那么,你知道如何识别或忽略假输入事件吗?为什么我突然听到所有按键(和释放)?在
xlib非常令人沮丧。在
from Xlib.display import Display
import Xlib
from Xlib import X
import Xlib.XK
import sys
import signal
display = None
root = None
def handle_event(aEvent):
print "handle!"
send_key("x")
def send_key(emulated_key):
global display,root
print "send key"
# ungrabbing doesnt help
root.ungrab_key(10,X.AnyModifier)
window = display.get_input_focus()._data["focus"]
# Generate the correct keycode
keysym = Xlib.XK.string_to_keysym(emulated_key)
keycode = display.keysym_to_keycode(keysym)
# Send a fake keypress via xtestaaa
Xlib.ext.xtest.fake_input(window, Xlib.X.KeyPress, keycode)
Xlib.ext.xtest.fake_input(window, Xlib.X.KeyRelease, keycode)
display.flush()
display.sync()
# fast forward those two events,this seems a bit hacky,
# what if theres another keyevent coming in at that exact time?
while display.pending_events():
display.next_event()
#
root.grab_key(10, X.AnyModifier, True,X.GrabModeSync, X.GrabModeSync)
def main():
# current display
global display,root
display = Display()
root = display.screen().root
# we tell the X server we want to catch keyPress event
root.change_attributes(event_mask = X.KeyPressMask)
# just grab the "1"-key for now
root.grab_key(10, X.AnyModifier, True,X.GrabModeSync, X.GrabModeSync)
# while experimenting everything could freeze, so exit after 10 seconds
signal.signal(signal.SIGALRM, lambda a,b:sys.exit(1))
signal.alarm(10)
while 1:
event = display.next_event()
print "event"
#if i dont call this, the whole thing freezes
display.allow_events(X.ReplayKeyboard, X.CurrentTime)
handle_event(event)
if __name__ == '__main__':
main()
我发现了问题。我几乎可以肯定xtest.fake_输入做一些奇怪的事情,因为当我手动发送按键和-释放(使用一些代码ifound)时,它可以工作
下面是一个示例,它在按键按下时只吞下“1”键,并在按键释放时将“x”发送到聚焦窗口:
相关问题 更多 >
编程相关推荐