【发布时间】:2020-08-02 06:33:33
【问题描述】:
这样做的热键是:
Alt+Shift - Win 8 和 10 中的 Windows 7 和 Win button + Space。
以编程方式,我可以使用WM_INPUTLANGCHANGEREQUEST 做到这一点,但这不是 Windows 这样做的方式。我试图弄清楚 Windows 如何改变布局。使用 spy++ 我发现 Windows 发送 WM_INPUTLANGCHANGE 消息正在改变布局,所以我自己尝试了一下:
SendMessage(myHWND, WM_INPUTLANGCHANGE, 0xCC, 0x4190419);
我有键盘钩子绑定,当按下 f1 时发送消息到当前活动窗口的活动控件。
但它不起作用,尽管 spy++ 中的消息是相同的:
第一个使用“Windows 热键”/“任务栏”来更改布局,它可以工作。其次我的信息,它没有工作。我是否遗漏了什么,为什么消息适用于“Windows”但不适用于我。
WM_INPUTLANGCHANGEREQUEST 可以工作,但它会冻结某些应用程序,我想弄清楚 Windows 是如何改变布局以避免这种情况发生的。
-- 更新。
在 DxO Photolab 3 中,在“导出到磁盘”对话框中使用 WM_INPUTLANGCHANGE 时它会冻结:
当您使用“Windows”方法(键盘热键/任务栏)更改布局时: 工作正常,不结冰。
发布 WM_INPUTLANGCHANGE: 收到 WM_INPUTLANGCHANGEREQUEST 并冻结:
我在 Skype、MS Office、Adobe After Effects 中也看到过类似的冻结。
【问题讨论】:
-
"
WM_INPUTLANGCHANGEREQUEST有效,但它会冻结某些应用程序" 您使用什么功能来传递此消息? -
@BenVoigt 我尝试了
SendMessage和PostMessage,它们都不适用于“某些应用程序”。 -
Win 8和Win 10可以使用
SendInput模拟Win button + Space。 -
@StriveSun-MSFT 我知道,但是如果我这样做时用户按住 Win 按钮怎么办?
-
@BladeMight 使用
GetAsyncKeyState检测是否按下了 Win 按钮。
标签: windows winapi keyboard-layout