我正在尝试将键盘布局更改为英语,但这些更改不会反射(reflect)在 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,结果相同
最佳答案
使用键盘布局相当棘手,并且对于控制台和 GUI 应用程序来说是不同的。不幸的是,LoadKeyboardLayout
只是让布局“可用于”激活。
图形界面
- 应用程序必须有
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);
关于c++ - LoadKeyboardLayout 不会改变键盘布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49210290/