我做了一个布局切换测试:
import win32api
import pyautogui
lcid = win32api.GetKeyboardLayout()
lang_code = hex(lcid & 0xFFFF)
print(lang_code)
pyautogui.hotkey('shift', 'alt')
lcid = win32api.GetKeyboardLayout()
lang_code = hex(lcid & 0xFFFF)
print(lang_code)
但它的工作方式非常奇怪:布局发生了变化,但 Python 没有注意到。
print(lang_code)开关前后输出相同的值。重新启动时,该值会发生变化,但在切换之前和之后仍然保持不变。
这里可能出了什么问题?
看完上面评论的话题后,我去研究enSO,发现了一个有趣的讨论。
结论:
实际上,针对该问题提出的解决方案在各处都是相同的:
最小的例子:
我借鉴了MessageBox和Language ID的一点想法,并将其全部分组到一个示例中:
有点令人失望的是,Windows 没有API来获取当前布局(全局),并且您需要在焦点窗口中导航。但如果你看得更远一点,问题就变得显而易见了。
可能会出现问题:为什么这段代码在控制台程序中运行时总是返回相同的布局(开始),即使布局发生了变化?
回答: 问题是控制台应用程序不允许处理Windows 消息。
因此,您必须创建自己的窗口并在那里处理 WM_INPUTLANGCHANGE消息,该消息在键盘布局更改时触发 - 根据找到的材料--one--、--two--我们有一个示例:
但即便如此,只有当焦点(或焦点返回)在我们的窗口上时,布局才会改变。
PS也许我错过了一些东西或者没有正确理解它,请随时在评论中纠正它,我会添加到答案中。
如何确定当前布局,如果是非英语,则切换到它?这是一个现成的控制台脚本(适用于 Windows;请注意,退出程序后,Windows 将返回其环境中的布局):