首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ASCII字符转换为x11密钥码

将ASCII字符转换为x11密钥码
EN

Stack Overflow用户
提问于 2012-09-10 08:01:23
回答 2查看 4.7K关注 0票数 7

我有一个小程序,以ascii字符的形式输入。我需要能够将这些转换为与x11函数使用的键码。有没有xlib函数来做这件事或者其他的库?或者一个大的开关柜效果最好?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-10 09:00:25

您至少可以使用XStringToKeysym将字母数字字符转换为KeySyms,然后使用XKeysymToKeycode将其转换为KeyCodes:

代码语言:javascript
复制
Display *display = ...;
KeySym sym_a = XStringToKeysym("A");
KeyCode code_a = XKeysymToKeycode(display, sym_a);

正如@BobDoolitle在他的answer中指出的那样,虽然XStringToKeysym适用于字母数字单字符字符串,但它在ASCII码的一般情况下失败了。他提供了一种简单地处理大多数ASCII码字符(0x20-0x7F)的方法,尽管超出这个范围的字符需要更仔细地处理。

票数 1
EN

Stack Overflow用户

发布于 2014-09-11 01:54:15

这个问题有一个古老的,错误的答案(来自@oldrinb),奇怪的是从未被质疑过。正如注释中所述,您不能在一般情况下使用XStringToKeysym将字符映射到KeySyms。它可以处理字母和数字,但仅此而已,因为KeySym名称恰好直接映射到这些ASCII码字符。对于其他ASCII字符,例如标点符号或空格,它将不起作用。

但你可以做得更好。如果您查看<X11/keysymdef.h>,您会发现对于ASCII 0x20-0xFF,字符直接映射到XKeySyms。因此,我认为直接使用该范围的字符作为KeySyms,并将剩余的32个字符映射到它们对应的KeyCodes会更简单。所以我会说代码应该更恰当的是:

代码语言:javascript
复制
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_A。例如,你必须发出:XK_CONTROL_L DOWN,XK_A DOWN,XK_A UP,XK_CONTROL_L UP。

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

代码语言:javascript
复制
#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

免责声明:在此代码的编写过程中,没有KeySyms受到损害。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12343987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档