转换ASCII字符X11键码(Convert ASCII character to x11 keyc

2019-06-28 01:51发布

我有一个小程序,需要输入ASCII字符形式。 我需要能够将这些转换成键码的使用与X11功能。 是否有一个Xlib的函数来做到这一点或其他图书馆? 或将大开关的情况下效果最好?

Answer 1:

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

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


Answer 2:

这个问题有一个旧的,错误的答案(来自@oldrinb),这很奇怪从来没有受到质疑。 正如评论所说,你不能使用XStringToKeysym以一般的方式映射到字符的keysyms。 它将为字母和数字的工作,但仅此而已,因为键符名称,系统会直接映射为那些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

免责声明:无键符在此代码的编写受到伤害。



文章来源: Convert ASCII character to x11 keycode
标签: c ascii xll