Unix X窗口的按键事件

Unix X窗口的按键事件,unix,x11,Unix,X11,我正在尝试编写一个小应用程序来捕获X下窗口的击键,然后使用OSD或其他工具将其显示在屏幕上。我们的想法是把它用于屏幕播放之类的东西 我试着做了一些手术,结果很好,但后来发现了一些有趣的事情。如果我在自己创建的窗口上使用xev,则会注册KEyPress和KeyRelease事件,我可以看到它们。但是,如果我使用xev的-id开关来监视另一个窗口并尝试在那里记录击键,则不会始终显示按键按下和按键释放事件。当某些事情发生时,我似乎会得到属性通知事件,但我感兴趣的不是按键和按键释放 某些窗口的行为符合预

我正在尝试编写一个小应用程序来捕获X下窗口的击键,然后使用OSD或其他工具将其显示在屏幕上。我们的想法是把它用于屏幕播放之类的东西

我试着做了一些手术,结果很好,但后来发现了一些有趣的事情。如果我在自己创建的窗口上使用xev,则会注册KEyPress和KeyRelease事件,我可以看到它们。但是,如果我使用xev的
-id
开关来监视另一个窗口并尝试在那里记录击键,则不会始终显示按键按下和按键释放事件。当某些事情发生时,我似乎会得到
属性通知
事件,但我感兴趣的不是
按键
按键释放

某些窗口的行为符合预期(例如gnome终端)。其他一些则没有(例如emacs gtk)


如何获取这些窗口的击键?

键事件转到具有焦点的窗口,而该窗口并不总是具有焦点的窗口。当我尝试在firefox窗口上使用
xev
时,关键事件会转到它的一个不可查看的子项(相对左上角为(-1,-1),大小为(1,1)


您可以使用
XGetInputFocus()
找出哪个窗口有焦点。

很有趣。当我使用
Alt Tab
为我的Emacs窗口提供焦点时,它似乎接收到事件,我可以跟踪它们。当我将鼠标悬停在它上面时,它没有。这很奇怪。我如何为窗口提供焦点?我想这应该是
XSetInputFocus
。从编程的角度来说,with
XSetInputFocus
。这解决了我的问题(尽管我不确定所有的技术细节),因此我将其标记为“已接受”。谢谢n.m.!:)