LoadKeyboardLayout不会更改键盘布局

时间:2018-03-10 14:39:57

标签: c++ winapi

我尝试将键盘布局更改为英语,但这些更改并未反映在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,结果相同

1 个答案:

答案 0 :(得分:1)

使用键盘布局相当棘手,它与控制台和GUI应用程序不同。 LoadKeyboardLayout不幸地让布局“可用”进行激活。

<强> GUI

  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);
    
  3. <强>控制台

    使用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);