我目前在Xlib上遇到问题,每当我调用XKeysymToKeycode()
并传递大写字母时KeySym
,它都会返回小写字母KeyCode
。对于这个问题,Google似乎并没有真正回答这个问题,也没有太多关于我正在使用的功能的文档。
这是我正在使用的代码:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>
int main(void) {
Display *display;
char *ptr;
char c[2] = {0, 0};
KeySym ksym;
KeyCode kcode;
display = XOpenDisplay(0);
ptr = "Test";
while (*ptr) {
c[0] = *ptr;
ksym = XStringToKeysym(c);
printf("Before XKeysymToKeycode(): %s\n", XKeysymToString(ksym));
kcode = XKeysymToKeycode(display, ksym);
printf("Key code after XKeysymToKeycode(): %s\n", XKeysymToString(XKeycodeToKeysym(display, kcode, 0)));
ptr++;
}
XCloseDisplay(display);
return 0;
}
可以使用进行编译gcc -o sendkeys sendkeys_min.c -lX11 -lXtst -g -Wall -Wextra -pedantic -ansi
(假设已另存为sendkeys_min.c
。)
当前输出如下:
Before XKeysymToKeycode(): T
Key code after XKeysymToKeycode(): t
Before XKeysymToKeycode(): e
Key code after XKeysymToKeycode(): e
Before XKeysymToKeycode(): s
Key code after XKeysymToKeycode(): s
Before XKeysymToKeycode(): t
Key code after XKeysymToKeycode(): t
预期的输出当然是,“ Test”中的第一个T通过后仍然是大写的XKeysymToKeycode()
。(请注意,这不是我的实际程序,而是在此处发布的简化版本。在实际程序中,我正在发送带有键码结果的键事件,并且所发送的键仍然在此处出现问题(它们全部变为小写))
KeySyms
并且KeyCodes
在语义上有所不同,并且它们之间没有1-1的关系。
AKeyCode
是一个任意的小整数,表示键盘上的键。(不是字符。一个键。)Xlib要求键代码在此范围内[8, 255]
,但是幸运的是,大多数键盘的键位仅多于100个。
AKeySym
是与键关联的某些实际字符的表示。其中几乎总是有几种:小写字母和大写字母对应于大多数终端布局上的相同键。
因此,没有“大写”或“小写”之类的东西KeyCode
。当您获得KeyCode
对应于Keysym的信息时,实际上您正在丢失信息。
在Xlib中,一个给定的键至少具有四个对应的键KeySyms
(小写,大写,交替的小写字母,交替的大写字母),尽管有些键可能未分配。当您要求与KeySym
相对应时KeyCode
,您需要提供一个索引;索引0(如您的代码中一样)将获得未移位的未修改字符。
对于给定的按键,转换为KeySym会考虑到修饰键的状态。其中有八个,包括Shift
和Lock
修饰符。忽略Lock
会使情况复杂化的Shift修饰键通常会将小写字母转换为大写字母(对于字母键)。
键盘处理比简短的摘要要复杂得多,但这只是一个开始。
对于您的任务,您可能应该看看XkbKeysymToModifiers
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句