gpt4 book ai didi

windows - 如何获取 Microsoft Edge 和 ApplicationFrameHost.exe 中托管的其他窗口的键盘布局

转载 作者:可可西里 更新时间:2023-11-01 10:12:48 28 4
gpt4 key购买 nike

众所周知,Windows 的键盘布局是特定于线程的。当布局发生变化时,shell 会向前台线程发送一条消息。因此,如果想要获得最新的系统范围键盘布局,就必须执行以下操作:

const HWND foregroundWindow = ::GetForegroundWindow();
const DWORD foregroundThread = ::GetWindowThreadProcessId(foregroundWindow, NULL);
const HKL layout = ::GetKeyboardLayout(foregroundThread);

这适用于大多数 native Windows 应用程序。

但是,UWP 应用程序和多个系统应用程序(包括 Microsoft Edge)在 ApplicationFrameHost.exe 中托管它们的窗口。这会导致 ::GetForegroundWindow() 返回所述进程的窗口,从而导致几个奇怪的问题,包括 misdetection of the foreground process以及检测实际键盘布局的麻烦。

ApplicationFrameHost.exe 的线程根本不会对系统范围内的键盘布局更改使用react。看起来他们并没有托管实际的重点 UI 元素。 ::GetForegroundWindow() 只返回框架窗口,但实际的 UI 元素有自己的线程,可能由自己的进程托管。因此,前台 framw 窗口根本没有收到相应的布局更改消息,并且它的线程有一个与之关联的陈旧的 HKL

如何检测前台进程的正确 HKL?

最佳答案

诀窍是完全停止依赖 GetForegroundWindow() 方法。

相反,我通过利用古怪和违反直觉的方法解决了问题,但是 documented specific usecase of GetGUIThreadInfo() .

如果您将零作为第一个参数传递给此函数,它将返回前台线程的信息——接收实际用户输入的线程!

该线程还将及时从 shell 接收与 HKL 相关的消息,因此键盘布局不会陈旧。

GUITHREADINFO gti = { sizeof(GUITHREADINFO) };

// fetching the foreground thread info
::GetGUIThreadInfo(0, &gti);

// you may also fallback to other window handles in the GUITHREADINFO
// if the `hwndFocus == NULL`
const DWORD thread = ::GetWindowThreadProcessId(gti.hwndFocus, NULL);
const HKL layout = ::GetKeyboardLayout(thread);

关于windows - 如何获取 Microsoft Edge 和 ApplicationFrameHost.exe 中托管的其他窗口的键盘布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51945835/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com