linux - 如何在 Linux 上捕获键盘布局更改事件并获取当前新的键盘布局?

标签 linux layout keyboard

现在,我正在Linux上开发应用程序,想捕获键盘布局更改事件(通过UI/widget/shell/编程等更改键盘布局)并获取/设置新的键盘布局信息以进一步处理.这不是一个新问题,我想,但我一次又一次地从 stackoverflow 搜索,但没有答案。希望我能在这里得到正确的答案!

这里介绍了我想学习的主要解决方案。在 Windows 中,WM_INPUTLANGCHANGE 窗口消息可以在 WinProc 中捕获,其中包含键盘布局信息。我们可以使用 GetKeyboardLayout() API 来获取当前的键盘布局信息。最后,如果我想使用我喜欢的键盘布局,我可以使用 ActivateKeyboardLayout() 来激活键盘布局。

综上所述,我希望在 Linux 中找到通知消息以及如何在代码中捕获消息(最好给我一个例子),Linux 中的 Get keyboard layout API 和 Set keyboard layout API。开发语言也是C/C++。

提前致谢。

最佳答案

另一个答案对我不起作用。它编译并运行,但是当我切换布局时 MappingNotify 事件不会发生。这是对我有用的修改。

#include <stdio.h>
#include <X11/Xutil.h>
#include <X11/XKBlib.h>

int main(int argc, char **argv)
{
        XEvent e;
        Display *d;

        if (!(d = XOpenDisplay(NULL))) {
                fprintf(stderr, "cannot open display\n");
                return 1;
        }

        XKeysymToKeycode(d, XK_F1);

    int xkbEventType;
    XkbQueryExtension(d, 0, &xkbEventType, 0, 0, 0);
    XkbSelectEvents(d, XkbUseCoreKbd, XkbAllEventsMask, XkbAllEventsMask);

    XSync(d, False);

    while (1) {
        XNextEvent(d, &e);
        if (e.type == xkbEventType) {
            XkbEvent* xkbEvent = (XkbEvent*) &e;
            if (xkbEvent->any.xkb_type == XkbStateNotify) {
                int lang = xkbEvent->state.group;
                if (lang == 1) {
                    fprintf(stdout, "1\n");
                    fflush(stdout);
                } else {
                    fprintf(stdout, "0\n");
                    fflush(stdout);
                }
            }
        }
    }

    return(0);
}

编译:

gcc -Wall -O2 xmappingnotify.c -o xmappingnotify -lX11

我是这样使用的:

xmappingnotify | xargs -I {} my-custom-command {} &

所以 my-custom-command [number_of_the_layout] 在我更改布局时运行。我有 2 个布局,xmappingnotify 为一个布局输出“1”,为另一个布局输出“0”。

关于linux - 如何在 Linux 上捕获键盘布局更改事件并获取当前新的键盘布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35569562/

相关文章:

java - Netbeans 在 debian 上无法正常工作

java - 选项卡和菜单在同一行 |安卓

css - 网格中图像内部的间距

swift - 在 tvOS 上打开键盘而不单击 TextField - Swift

ios - 在 Xamarin 中按下按钮后关闭键盘

linux - 增加多个文件名 Bash 的数量

Python - 如何删除窗口边框?我已经将 UI 从 Qt 导入 Python 并应用了 setWindowFlags

linux - 如何将我在 Vim 编辑器中使用的所有命令记录在一个特殊文件中?

android - 如何在布局 xml 中使用自定义 View

ios - 在 iOS 8 中显示隐藏键盘时编辑 UIView 的边界