OK,如果你是X11下,你想要得到的大骨節病,你需要做一個搶。 如果你不是,我唯一的好答案是來自終端的ncurses。
這裏是你如何抓住一切從鍵盤和再次釋放:從終端
/* Demo code, needs more error checking, compile
* with "gcc nameofthisfile.c -lX11".
/* weird formatting for markdown follows. argh! */
#include <X11/Xlib.h>
int main(int argc, char **argv)
{
Display *dpy;
XEvent ev;
char *s;
unsigned int kc;
int quit = 0;
if (NULL==(dpy=XOpenDisplay(NULL))) {
perror(argv[0]);
exit(1);
}
/*
* You might want to warp the pointer to somewhere that you know
* is not associated with anything that will drain events.
* (void)XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, x, y);
*/
XGrabKeyboard(dpy, DefaultRootWindow(dpy),
True, GrabModeAsync, GrabModeAsync, CurrentTime);
printf("KEYBOARD GRABBED! Hit 'q' to quit!\n"
"If this job is killed or you get stuck, use Ctrl-Alt-F1\n"
"to switch to a console (if possible) and run something that\n"
"ungrabs the keyboard.\n");
/* A very simple event loop: start at "man XEvent" for more info. */
/* Also see "apropos XGrab" for various ways to lock down access to
* certain types of info. coming out of or going into the server */
for (;!quit;) {
XNextEvent(dpy, &ev);
switch (ev.type) {
case KeyPress:
kc = ((XKeyPressedEvent*)&ev)->keycode;
s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0));
/* s is NULL or a static no-touchy return string. */
if (s) printf("KEY:%s\n", s);
if (!strcmp(s, "q")) quit=~0;
break;
case Expose:
/* Often, it's a good idea to drain residual exposes to
* avoid visiting Blinky's Fun Club. */
while (XCheckTypedEvent(dpy, Expose, &ev)) /* empty body */ ;
break;
case ButtonPress:
case ButtonRelease:
case KeyRelease:
case MotionNotify:
case ConfigureNotify:
default:
break;
}
}
XUngrabKeyboard(dpy, CurrentTime);
if (XCloseDisplay(dpy)) {
perror(argv[0]);
exit(1);
}
return 0;
}
運行這一點,所有的大骨節病的事件應該打。我在Xorg 下測試它,但它使用了可敬的,穩定的Xlib機制。
希望這會有所幫助。
小心X下抓鬥當你是新來的他們,有時候這是一個好主意 開始時間延遲進程,ungrab服務器,當你 測試代碼,讓它坐和運行,每隔幾分鐘就開始一次。 它可以節省不必要的操作或從服務器切換到外部重置狀態。
從這裏,我將留給你決定如何多路複用renderes。閱讀 XGrabKeyboard文檔和XEvent文檔即可開始使用。 如果您有小窗口暴露在屏幕角落,您可以將指針插入一個角落以選擇控制器。 XWarpPointer可以通過 將指針指向其中的一個以及代碼。
還有一點:你可以抓住指針以及其他資源。如果您有一個控制器在您坐的前面的盒子上運行,您可以使用鍵盤和鼠標輸入在具有不同渲染器的開放套接字之間切換。用這種方法,你不需要再把輸出窗口的大小調整到小於全屏。通過更多的工作,您可以使用SHAPE和COMPOSITE擴展實際上將頂層混合疊加層放在頂層,以響應用戶輸入(這可能被視爲鍍金百合),獲得不錯的疊加功能。
我刪除了導致上面澄清的「答案」...我認爲澄清需要保留,但它足夠覆蓋我的僞回答,可能是一條評論,可以完全刪除。 – 2008-09-15 16:37:48