好的,如果您在 X11 下并且想要获取 kbd,则需要进行抓取。
如果你不是,我唯一的好答案是来自终端的 ncurses。
以下是您从键盘上抓取所有内容并再次释放的方法:
/* 演示代码,需要更多的错误检查,编译
* 使用“gcc nameofthisfile.c -lX11”。
/* 奇怪的降价格式如下。啊! */
#include <X11/Xlib.h>
int main(int argc, char **argv)
{
显示 *dpy;
XEvent EV;
字符 *s;
无符号整数 kc;
诠释退出= 0;
if (NULL==(dpy=XOpenDisplay(NULL))) {
错误(argv[0]);
退出(1);
}
/*
* 您可能希望将指针扭曲到您知道的某个地方
* 与任何会耗尽事件的东西无关。
* (void)XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, x, y);
*/
XGrabKeyboard(dpy, DefaultRootWindow(dpy),
真,GrabModeAsync,GrabModeAsync,当前时间);
printf("键盘被抓!按 'q' 退出!\n"
"如果这个工作被杀死或者你卡住了,使用 Ctrl-Alt-F1\n"
“切换到控制台(如果可能)并运行\n”
"松开键盘。\n");
/* 一个非常简单的事件循环:从“man XEvent”开始了解更多信息。 */
/* 另请参阅“apropos XGrab”,了解锁定访问权限的各种方法
*某些类型的信息。出入服务器 */
对于 (;!quit;) {
XNextEvent(dpy, &ev);
开关(ev.type){
案例按键:
kc = ((XKeyPressedEvent*)&ev)->keycode;
s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0));
/* s 为 NULL 或静态无接触返回字符串。 */
if (s) printf("KEY:%s\n", s);
if (!strcmp(s, "q")) quit=~0;
休息;
案例曝光:
/* 通常,最好将剩余的暴露暴露在
* 避免访问 Blinky's Fun Club。 */
while (XCheckTypedEvent(dpy, Expose, &ev)) /* 空体 */ ;
休息;
案例按钮按下:
案例按钮释放:
案例密钥发布:
案例 MotionNotify:
案例配置通知:
默认:
休息;
}
}
XUngrabKeyboard(dpy, CurrentTime);
如果(XCloseDisplay(dpy)){
错误(argv[0]);
退出(1);
}
返回0;
}
从终端运行它,所有 kbd 事件都应该命中它。我在 Xorg 下测试
但它使用古老而稳定的 Xlib 机制。
希望这会有所帮助。
小心 X 下的抓取。当您不熟悉它们时,有时这很好
开始一个时间延迟过程的想法,当你在
测试代码,让它坐下来运行,每隔几分钟就取消抓取。
它省去了杀死服务器或从服务器切换到外部重置状态的麻烦。
从这里开始,我将由您来决定如何复用渲染。读
XGrabKeyboard 文档和 XEvent 文档开始。
如果您在屏幕角落暴露了小窗口,则可能会卡住
将指针移到一个角落以选择控制器。 XWarpPointer 可以
将指针也从代码中推到其中之一。
还有一点:您也可以抓取指针和其他资源。如果您坐在前面的盒子上运行一个控制器,您可以使用键盘和鼠标输入在具有不同渲染器的打开套接字之间切换它。使用这种方法,您不再需要将输出窗口的大小调整为小于全屏。通过更多的工作,您实际上可以使用 SHAPE 和 COMPOSITE 扩展在顶部放置 alpha 混合叠加,以获得一个很好的叠加功能来响应用户输入(这可能算作给百合镀金)。