【问题标题】:Get window handle from window class name从窗口类名获取窗口句柄
【发布时间】:2011-02-26 00:00:56
【问题描述】:

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

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

【问题讨论】:

    标签: c# winapi window-handles findwindow


    【解决方案1】:

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

    【讨论】:

    • 我刚刚注意到您问题的 findwindow 标签 - 猜得不错。 :)
    • FindWindow 只查找顶级窗口,FindWindowEx 是你真正的意思,但是调用 Enum 函数更安全,这样你就不会错过任何窗口
    • @Anders:已经添加了 FindWindowEx 链接。在大多数情况下,FindWindow 返回您想要的窗口。最安全的方法是首先不要乱用 Windows 类名。
    【解决方案2】:

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

    【讨论】:

    • WindowFromPoint 不适用于此处,除非您建议用户必须在特定时间或事件将光标指向此窗口!
    • @Anders,VsTipWindow 是一种工具提示窗口。工具提示窗口具有在鼠标悬停在另一个窗口上时可见并在鼠标离开窗口时消失的性质。但是 WindowFromPoint 与鼠标点本身无关。它提供每个任意点的窗口句柄。如果它在这里适用与否不是问题,请阅读我的前三个字。我只想提供另一个想法,以防 Einars 的第一个想法行不通。我们甚至不知道他要做什么
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 谢谢,成功了。虽然要明确“EnumChildWindows recursivly”,但实际上您只需使用顶级窗口句柄调用它一次,EnumChildWindows 函数本身已经进行了递归。
    【解决方案4】:

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

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

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

    【讨论】:

    • 好的。但在这种特殊情况下,我知道该特定窗口类一次只有一个活动窗口,所以这不是问题。我可能应该在问题中说明这一点:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2013-01-25
    • 2014-01-28
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多