C++ GetGuitThreadInfo()是如何工作的?

C++ GetGuitThreadInfo()是如何工作的?,c++,winapi,C++,Winapi,我正在尝试获取当前聚焦窗口的HWND和ThreadID 通常getForeGroundIndow()然后调用GetThreadProcessId()会为我提供正确的信息 但是在IE8中,HWnd getForeGroundIndow()提供了IE框架的HWnd,但实际上聚焦窗口(文档对象或Internet Explorer_服务器)是不同的(在不同的进程中运行)。所以getForeGroundIndow()方法不起作用 因此,我使用了GetGuitThreadInfo(DWORD tid),并将

我正在尝试获取当前聚焦窗口的HWND和ThreadID

通常getForeGroundIndow()然后调用GetThreadProcessId()会为我提供正确的信息

但是在IE8中,HWnd getForeGroundIndow()提供了IE框架的HWnd,但实际上聚焦窗口(文档对象或Internet Explorer_服务器)是不同的(在不同的进程中运行)。所以getForeGroundIndow()方法不起作用

因此,我使用了GetGuitThreadInfo(DWORD tid),并将从GetForeGroundIndow获得的threadId传递给它。。像这样的东西

DWORD tid = GetWindowThreadProcessId(GetForegroundWindow(),0);
GetGuiThreadInfo(tid,&guiThreadInfoObject);
HWND focus = guiThreadInfoObject.hwndFocus;
使用上述方法,我得到了正确的Internet Explorer_服务器对象的HWND,这是正确的。 然而,我不明白,即使GetGuitThreadInfo()在另一个进程(即IE Frame)中获取线程的ThreadId,但它如何能够在另一个进程和线程上获取有关Internet Explorer_服务器对象的threadinfo


谢谢

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

这里有一些回旋余地——我还没有找到任何地方明确指出前景窗口是具有输入焦点的窗口。(可能它已经检索顶级父级/所有者?)

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


无论如何,由于没有明确说明,我不会把我的生命押在这种行为上——这意味着在许多系统上进行测试,并将该方法视为一个弱点,如果可能的话,应该加以改进。

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

相反,使用EnumChildWindows(),对找到的每个子项进行迭代,直到得到一个GetClassName()调用返回“Internet Explorer\u Server”的窗口


顺便说一句,感谢您提出这个问题。SetParent()的文档中明确禁止IE所做的事情。我只知道Acrobat违反了这条规则,但现在你提供了微软程序这样做的证据。这就解决了,这不再是一个规则

谢谢。现在我得到了正确的结果。。这是否意味着情况将永远如此。这意味着我想知道这是否是GetGuitThreadInfo()方法的预期行为,对于任何其他应用程序,它的行为都将与IE8相同。正如我所说,这是有意义的,但文档中没有明确说明。谢谢,但是GetFocus()始终返回0,因为具有焦点的窗口位于不同的线程上。应用程序可以是任何东西。IE8只是其中之一。所以我想要一些通用的东西,所以我不能使用EnumChildWindows()来查找Internet Explorer\u服务器。“通用的东西”没有意义。如果你想搞乱另一个进程的窗口,你需要定制你的代码来处理特定的进程及其实现细节。