有没有人知道一个 xlib 函数来捕获按键事件而不会失去原始焦点?如何摆脱它?
(或“使用 XGrabKey() 而不生成 Grab 样式的焦点”?)
(或“如何在系统级别摆脱 NotifyGrab 和 NotifyUngrab 焦点事件?)
XGrabKey 将失去对按下键的关注并恢复对释放键的关注。
我想捕获按键而不会将其泄漏到原始窗口(就像 XGrabKey 可以做到的那样)。
引用资料:
...XGrabKey 将窃取焦点... https://bugs.launchpad.net/gtkhotkey/+bug/390552/comments/8
...程序接收控制以响应组合键。同时,该计划暂时集中在... During XGrabKey(board), discover which window had been focused
...XGrabKeyboard 函数主动获取键盘控制权并生成 FocusIn 和 FocusOut 事件... http://www.x.org/archive/X11R6.8.0/doc/XGrabKeyboard.3.html#toc3
...我看不到 提供 metacity 当前桌面更改行为的方法(更改 并同时显示弹出对话框)而不会导致 抓取式对焦窗外... https://mail.gnome.org/archives/wm-spec-list/2007-May/msg00000.html
...在使用 NotifyGrab 的 FocusOut 事件上不应退出全屏模式... https://bugzilla.mozilla.org/show_bug.cgi?id=578265
抓取键盘不允许改变焦点... grabbing keyboard doesnt allow changing focus
Grabs 生成的焦点事件(XGrabKeyboard 的主动抓取和 XGrabKey 的被动抓取) http://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html#Focus_Events_Generated_by_Grabs
XGrabKey 源代码:http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/GrKey.c也许我们可以修改它以消除焦点事件?
有“DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);”在 ActivateKeyboardGrab() 中: http://cgit.freedesktop.org/xorg/xserver/tree/dix/events.c
我正在编写一个按键组合(和鼠标移动)映射软件:https://code.google.com/p/diyism-myboard/
我已经在 Windows 中使用 RegisterHotKey() 和 UnRegisterHotKey() 实现了它:https://code.google.com/p/diyism-myboard/downloads/detail?name=MyBoard.pas
我想用 XGrabKey() 和 XUngrabKey() 将它迁移到 Linux:https://code.google.com/p/diyism-myboard/downloads/detail?name=myboard.py
我已经创建了 10 美元的赏金来解决这个问题。我们需要更多的支持者来发放赏金。 https://www.bountysource.com/issues/1072081-right-button-menu-flashes-while-jkli-keys-move-the-mouse-pointer
最佳答案
我当前的代码(来自 http://diyism-myboard.googlecode.com/files/myboard.py ):
disp=Display()
screen=disp.screen()
root=screen.root
def grab_key(key, mod):
key_code=string_to_keycode(key)
#3rd: bool owner_events, 4th: pointer_mode, 5th: keyboard_mode, X.GrabModeSync, X.GrabModeAsync
root.grab_key(key_code, mod, 0, X.GrabModeAsync, X.GrabModeAsync)
root.grab_key(key_code, mod|X.LockMask, 0, X.GrabModeAsync, X.GrabModeAsync) #caps lock
root.grab_key(key_code, mod|X.Mod2Mask, 0, X.GrabModeAsync, X.GrabModeAsync) #num lock
root.grab_key(key_code, mod|X.LockMask|X.Mod2Mask, 0, X.GrabModeAsync, X.GrabModeAsync)
def main():
grab_key('Shift_L', X.NONE)
grab_key('Shift_R', X.NONE)
while 1:
evt=root.display.next_event()
if evt.type in [X.KeyPress, X.KeyRelease]: #ignore X.MappingNotify(=34)
handle_event(evt)
if __name__ == '__main__':
main()
当我按下“shift”键时,焦点丢失,当我松开它时,焦点又回来了。
关于python - 为什么 XGrabKey 会生成额外的聚焦和聚焦事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15270420/