c++ - LoadKeyboardLayout 不会改变键盘布局

标签 c++ winapi

我正在尝试将键盘布局更改为英语,但这些更改不会反射(reflect)在 Windows 中。

布局已安装,我已使用 GetKeyboardLayoutList 检查。

screenshot

代码:

#include <windows.h>

int main()
{
    LoadKeyboardLayout("00000409", KLF_ACTIVATE);
    return 0;
}

GetKeyboardLayoutName 显示语言已更改,但我在 Windows 中看不到

测试代码:

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
    TCHAR keyboard[KL_NAMELENGTH];
    GetKeyboardLayoutName(keyboard);
    cout << keyboard << endl;

    LoadKeyboardLayout("00000409", KLF_ACTIVATE);

    GetKeyboardLayoutName(keyboard);
    cout << keyboard << endl;

    return 0;
}

输出:

00000405
00000409
[Finished in 2.2s]

更新:尝试在不同的 Windows 计算机上运行 .exe,结果相同

最佳答案

使用键盘布局相当棘手,并且对于控制台和 GUI 应用程序来说是不同的。不幸的是,LoadKeyboardLayout 只是让布局“可用于”激活。

图形界面

  1. 应用程序必须GetMessageTranslateMessageDispatchMessage 循环。 (Sublime有GetMessage循环)
  2. 您可以通过连续两次调用来切换布局

    DWORD dwNewKeybLayout = 0x00000409; // Layout must be already loaded!
    PostMessage(hWnd, WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)dwNewKeybLayout);
    PostMessage(hWnd, WM_INPUTLANGCHANGE, 0, (LPARAM)dwNewKeybLayout);
    

控制台

您使用int main() 的应用程序是控制台应用程序,它没有GetMessage 循环。所有消息都由 conhost 本身处理。这就是为什么您的 GetKeyboardLayoutName 不会返回正确结果的原因。绝不!不行!

但是,您仍然可以更改在此控制台窗口中运行的所有进程的布局。但请记住,conhost 异步处理消息,实际布局(您无法确定或检查)可能会在一段时间后发生变化。

    HWND hCon = GetConsoleWindow();
    DWORD dwNewKeybLayout = 0x00000409; // Layout must be already loaded!
    PostMessage(hCon, WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)dwNewKeybLayout);
    PostMessage(hCon, WM_INPUTLANGCHANGE, 0, (LPARAM)dwNewKeybLayout);

关于c++ - LoadKeyboardLayout 不会改变键盘布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49210290/

相关文章:

c++ - 在 C++0x 中专门针对 lambda 模板

c++ - SetProcessDPIAware 似乎在 Windows 10 下不起作用

c++ - 自动线程恢复 C++

c++ - 注释函数的内容,但保持对函数的调用不变。编译器是否发现不编译函数?

c++ - 如何设置位图作为子窗口的背景(WIN32)

python - python ctypes中的未知数组长度

c# - 用代码模拟窗口拖放?

c++ - SetWindowsHookEx 成功但从未调用回调函数

c++ - header 中的私有(private)变量

c++ - 图像搜索中的 OpenCV 图像 (C++)