我有一个小程序,需要输入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_A
与XK_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