2012-09-10 289 views
4

我有一个以ascii字符形式输入的小程序。我需要能够将它们转换为用于x11函数的键码。是否有一个xlib函数来执行此操作或另一个库?或者一个大型开关盒的效果最好?将ASCII字符转换为x11键码

回答

1

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

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

这在一般情况下不起作用。 XStringToKeysym映射KeySym名称,而不是ASCII字符。您经常可以正常使用,因为对于常见的打印字符,KeySym名称与字符匹配,但不适用于空格字符。 – BobDoolittle

7

这个问题有一个旧的,错误的答案(来自@oldrinb),奇怪的是从未受到过挑战。如注释中所述,不能使用XStringToKeysym以通用方式将字符映射到KeySyms。它将适用于字母和数字,但这就是它的原因,因为KeySym名称直接映射到这些ASCII字符。对于其他ASCII字符(如标点符号或空格)不起作用。

但你可以做得比这更好。如果你看看<X11/keysymdef.h>,你发现对于ASCII 0x20-0xFF,字符映射直接XKeySyms。所以,我想说直接使用这个范围的字符更简单,就像KeySyms一样,然后将其余的32个字符映射到对应的KeyCodes。所以,我想说的代码应该更恰当地:

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

的“其他”子句将需要多个KeyCodes因为例如ASCII 1(控制-A)是XK_AXK_CONTROL_R(或XK_CONTROL_L)修改。所以你必须发行例如:XK_CONTROL_L DOWN,XK_A DOWN,XK_A UP,XK_CONTROL_L UP。

这里有一个玩具程序,由通过模拟键盘事件呼应的第一个参数说明了这一点:

#include <stdio.h> 
#include <X11/Xlib.h> 
#include <X11/Xlib-xcb.h> 
#include <xcb/xcb.h> 
#include <xcb/xcb_event.h> 
#include <xcb/xtest.h> 

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

免责声明:无键符中的写作受到伤害这段代码。