GetGuiThreadInfo()如何工作?

时间:2010-03-26 09:33:53

标签: c++ winapi

我正在尝试获取当前Focussed Window的HWND和ThreadID。

通常GetForegroundWindow()然后调用GetThreadProcessId()给我正确的信息。

但是在IE8的情况下,GetForegroundwindow()给出了IE帧的HWND,但实际上焦点窗口(文档对象或Internet Explorer_server)是不同的(在不同的进程中运行)。所以GetForegroundWindow()方法不起作用。

所以我使用了GetGuiThreadInfo(DWORD tid),并将从GetForegroundWindow获得的threadId传递给它......就像这样;

DWORD tid = GetWindowThreadProcessId(GetForegroundWindow(),0);
GetGuiThreadInfo(tid,&guiThreadInfoObject);
HWND focus = guiThreadInfoObject.hwndFocus;

使用上述方法,我获得了正确的Internet Explorer_server对象的正确HWND。 但是我不明白,即使GetGuiThreadInfo()在IE框架的不同进程中获取线程的ThreadId,如何能够获取有关Internet Explorer_server对象的threadinfo,该对象位于不同的进程和线程上? / p>

由于

2 个答案:

答案 0 :(得分:2)

使用GetFocus()获取具有焦点的窗口非常容易。虽然我认为GetGuiThreadInfo()使用来自窗口管理器的内部数据。如果IE被最小化或没有焦点,您的方法可能会失败。

对您找到的每个子项迭代使用EnumChildWindows(),直到您获得一个GetClassName()调用返回“Internet Explorer_Server”的窗口。

感谢你带来这个btw。在SetParent()的文档中明确禁止IE正在做什么。我只知道Acrobat违反了这个规则,但现在你提供了一个Microsoft程序这样做的证据。这解决了它,它不再是一个规则!

答案 1 :(得分:0)

GetWindowThreadProcessId检索创建(在您的案例前景中)窗口的线程ID guiThreadInfoObject.hwndFocus是输入焦点的窗口。

这里有一些余地 - 我没有找到任何特别声明前景窗口的地方是有输入焦点的地方。 (也许它已经检索到顶层父级/所有者?)。

此外,AttachThreadInput可能会稍微改变游戏 - 通过将线程输入焦点设置为不同进程的窗口。

无论如何,由于它没有明确说明,我不会打赌我的生活 - 这意味着在许多系统上进行测试并将该方法视为应尽可能改进的弱点。