8

我试图在我的进程中获取子窗口的窗口句柄,我拥有的唯一信息是窗口类名。有没有我可以使用的win32函数?我正在从 C# 执行此操作。

更详细一点:这是一个 Visual Studio 插件,用 C# 编写。所以我的流程是visual studio,它有很多窗口。其中一个有一个窗口类“VsTipWindow”。我不知道那个窗口的直接父窗口,我只有类名。有什么方法可以让我从中获取窗口句柄吗?

4

4 回答 4

3

FindWindow是您为此需要的 Win32 调用(或者FindWindowEx,如果有多个具有该特定类名称的窗口,并且 FindWindow 没有返回您正在寻找的那个)。

于 2010-05-31T13:50:57.253 回答
1

只是附加信息..
知道您可以从点
WindowFromPoint
http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx获取窗口句柄可能很有用

于 2010-05-31T13:59:31.430 回答
0

首先应该注意的是窗口和窗口类之间没有一对一的关系,多个窗口可以使用同一个类。

我想你唯一的选择是从顶层 Visual Studio 窗口开始递归调用 EnumChildWindows(或者如果你知道一个是 VsTipWindow 窗口的祖父级的窗口层次结构中更高的其他窗口)在 EnumChildWindows 的回调函数中,你会调用GetClassName 并将字符串与 VsTipWindow 进行比较,直到找到窗口。

既然你谈到了未知的父母,我假设你在一个子窗口之后,但如果这个窗口是一个顶级窗口,你需要使用 EnumWindows (你可能应该使用 GetWindowThreadProcessId 来确保你得到正确的进程之后你会找到一个具有该类名的窗口)

(我确信 .NET 具有与本机 api 执行相同操作的功能,否则您必须 PInvoke)

于 2010-05-31T13:54:33.360 回答
0

Win32 窗口类是控件的通用实现,窗口句柄是控件的实例。因此,您将拥有多个具有相同窗口类的窗口句柄(例如:EDIT)。严格来说,窗口类是指向窗口过程的指针。

像.net(甚至MFC)这样的框架倾向于为所有的窗口控件共享很少的窗口类,然后它们将分派给适当的控件(即它们有一个通用的窗口过程)。对于 Visual Studio 或 Office 等大型应用程序也是如此。

因此,这使得仅通过其窗口类来检测特定窗口变得非常困难。但是,您可以使用 枚举具有特定窗口类的所有窗口FindWindow,您还将获得可能对您有所帮助的窗口文本。使用GetWindowThreadProcessId您可以检测窗口是否属于 Visual Studio。

于 2010-05-31T13:57:03.990 回答