我正在尝试在我的进程中获取子窗口上的窗口句柄,我唯一的信息是窗口类名称。我可以使用任何win32函数吗?我是用C#做的。
更详细一点:这是一个用C#编写的Visual Studio插件。所以我的过程是visual studio,它有很多窗口。其中一个有一个窗口类“VsTipWindow”。我不知道那个窗口的直接父窗口,我只有类名。有没有办法让我从那个窗口处理?
答案 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。