我尝试将键盘布局更改为英语,但这些更改并未反映在Windows中。
已安装布局,我已使用GetKeyboardLayoutList检查。
代码:
#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,结果相同
答案 0 :(得分:1)
使用键盘布局相当棘手,它与控制台和GUI应用程序不同。 LoadKeyboardLayout
不幸地让布局“可用”进行激活。
<强> GUI 强>
GetMessage
,TranslateMessage
,DispatchMessage
周期。 (Sublime有GetMessage
周期)您可以使用两个后续调用切换布局
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);