将ASCII字符转换为x11键码

我有一个小程序,以ascii字符的forms输入。 我需要能够将这些转换为密钥代码以用于x11函数。 是否有xlib函数来执行此操作或其他库? 或者大型开关盒效果最好吗?

您可以使用XStringToKeysym转换为KeySym ,然后使用XKeysymToKeycode转换为KeyCode

 Display *display = ...; KeySym sym_a = XStringToKeysym("A"); KeyCode code_a = XKeysymToKeycode(display, sym_a); 

这个问题有一个古老而错误的答案(来自@oldrinb),奇怪的是从来没有受过质疑。 如评论中所述,您不能使用XStringToKeysym以一般方式将字符映射到KeySyms。 它适用于字母和数字,但这就是它,因为KeySym名称恰好直接映射到那些ASCII字符。 对于其他ASCII字符,如标点符号或空格,它将无法工作。

但你可以做得更好。 如果你看你会发现对于ASCII 0x20-0xFF,这些字符直接映射到XKeySyms 。 所以,我想说直接将KeySyms字符范围用作KeySyms更简单,只需将剩下的32个字符映射到相应的KeyCodes 。 所以我要说代码应该更合适:

 Display *display = ...; if ((int)c >= 0x20) { XKeysymToKeycode(display, (KeySym)c); } else { ... // Exercise left to the reader :-) } 

‘else’子句将需要多个KeyCodes因为例如ASCII 1(Control-A)是带有XK_CONTROL_R (或XK_CONTROL_L )修饰符的XK_CONTROL_L 。 所以你必须发出例如: XK_CONTROL_L DOWN, XK_A DOWN, XK_A UP, XK_CONTROL_L UP。

这是一个玩具程序,通过模拟键盘事件回显第一个参数来演示这一点:

 #include  #include  #include  #include  #include  #include  main(int argc, char **argv) { char *pc; xcb_connection_t *xconn; KeyCode code_a; Display *dpy = XOpenDisplay(NULL); xconn = XGetXCBConnection(dpy); for (pc = argv[1]; *pc != '\0'; ++pc) { if (*pc >= (char)0x20) { code_a = XKeysymToKeycode(dpy, (KeySym)*pc); xcb_test_fake_input(xconn, XCB_KEY_PRESS, code_a, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0); xcb_test_fake_input(xconn, XCB_KEY_RELEASE, code_a, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0); xcb_flush(xconn); } else { fprintf(stderr, "Eeek - out-of-range character 0x%x\n", (unsigned int)*pc); } } XCloseDisplay(dpy); } 

您需要将其链接: -lX11 -lxcb -lxcb-xtest -lX11-xcb

免责声明:在编写此代码时,没有任何KeySyms受到损害。