从窗口类名称获取窗口句柄

时间:2010-05-31 13:47:32

标签: c# winapi window-handles findwindow

我正在尝试在我的进程中获取子窗口上的窗口句柄,我唯一的信息是窗口类名称。我可以使用任何win32函数吗?我是用C#做的。

更详细一点:这是一个用C#编写的Visual Studio插件。所以我的过程是visual studio,它有很多窗口。其中一个有一个窗口类“VsTipWindow”。我不知道那个窗口的直接父窗口,我只有类名。有没有办法让我从那个窗口处理?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

只是附加信息..
也许知道你可以从一个点获得一个窗口的句柄是有用的 WindowFromPoint
http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx

答案 2 :(得分:0)

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

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

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

(我确信.NET的功能和本机api的功能相同,或者你必须使用PInvoke)

答案 3 :(得分:0)

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

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

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