gpt4 book ai didi

将 ASCII 字符转换为 x11 键码

转载 作者:太空狗 更新时间:2023-10-29 17:19:53 26 4
gpt4 key购买 nike

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

最佳答案

这个问题有一个古老的错误答案(来自@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 :-)
}

'else' 子句将需要多个 KeyCodes因为例如 ASCII 1 (Control-A) 是 XK_AXK_CONTROL_R (或 XK_CONTROL_L )修饰符。所以你必须发出例如:XK_CONTROL_L向下,XK_A向下,XK_A上,XK_CONTROL_L上。

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

#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 受到伤害。

关于将 ASCII 字符转换为 x11 键码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12343987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com