为什么 XKeysymToKeycode() 使我的所有键都小写?

App*_*ash 1 c x11 xlib

我目前在使用 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;
}    
Run Code Online (Sandbox Code Playgroud)

它可以编译为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
Run Code Online (Sandbox Code Playgroud)

当然,预期的输出是“Test”中的第一个 T 在运行后仍然是大写的XKeysymToKeycode()。(请注意,这不是我的实际程序,而是在这里发布的简化版本。在实际程序中,我发送带有生成的键码的键事件,并且发送的键仍然存在此处显示的问题(它们都变成了小写))

ric*_*ici 6

KeySymsKeyCodes在语义上是不同的,它们之间没有 1-1 的关系。

  • AKeyCode是一个任意的小整数,代表键盘上的一个键。(不是字符。一个键。)Xlib 要求键代码在范围内[8, 255],但幸运的是大多数键盘只有 100 多个键。

  • AKeySym是与键关联的某些实际字符的表示。几乎总是有几个这样的:小写和大写字母对应于大多数终端布局上的相同键。

所以没有“大写”或“小写”这样的东西KeyCode。当您获得KeyCode对应于 Keysym 的信息时,您实际上是在丢失信息。

在 Xlib 中,一个给定的键至少有四个对应的KeySyms(小写、大写、替代小写、替代大写),尽管有些可能是未分配的。当您要求KeySym对应于 a 时KeyCode,您需要提供一个索引;索引 0(如在您的代码中)将获得未移位的未修改字符。

对于给定的按键,转换为 KeySym 将考虑修饰键的状态。其中有八个,包括ShiftLock修饰符。忽略Lock使情况复杂化的 ,shift 修饰键通常会将小写字母转换为大写字母(对于字母键)。

键盘处理比那个简短的总结复杂得多,但它只是一个开始。

对于您的任务,您可能应该查看XkbKeysymToModifiers.