这是我的例子
#include <X11/X.h>#include <X11/Xlib.h>#include <X11/Xutil.h>#include <stdio.h>#include <ctype.h>int main (){ Display* d = XOpenDisplay(NULL); Window root = DefaultRootWindow(d); Window curFocus; char buf[17]; KeySym ks; XComposeStatus comp; int len; int revert; XGetInputFocus (d, &curFocus, &revert); XSelectInput(d, curFocus, KeyPressMask|KeyReleaseMask|FocusChangeMask); while (1) { XEvent ev; XNextEvent(d, &ev); switch (ev.type) { case FocusOut: printf ("Focus changed!n"); printf ("Old focus is %dn", (int)curFocus); if (curFocus != root) XSelectInput(d, curFocus, 0); XGetInputFocus (d, &curFocus, &revert); printf ("New focus is %dn", (int)curFocus); if (curFocus == PointerRoot) curFocus = root; XSelectInput(d, curFocus, KeyPressMask|KeyReleaseMask|FocusChangeMask); break; case KeyPress: printf ("Got key!n"); len = XLookupString(&ev.xkey, buf, 16, &ks, &comp); if (len > 0 && isprint(buf[0])) { buf[len]=0; printf("String is: %sn", buf); } else { printf ("Key is: %dn", (int)ks); } } }}它不可靠,但在大多数情况下都有效。(它显示的是我正在此框中输入的键)。您可能会调查为什么有时会失败;)原则上它也不能显示热键。热键是获取的密钥,只有一个客户端可以获取获取的密钥。除了加载为此目的而设计的特殊X11扩展(例如XEvIE)以外,这里绝对不能做任何事情。



