使用 win32 获取对象实例 API

Getting Instance of Object using win32 API

您好,我正在尝试获取外部程序中控件的句柄。我可以获得主窗体句柄,然后是面板句柄,但无法确定我正在获取哪个面板的句柄,因为有 4 个面板显示使用 spy++

我知道如果我可以 select 使用实例的面板,这将允许我 select 我想要的面板。我要 select TPanel3.

    Dim destination As IntPtr = FindWindow("TDeviceMainForm", "Gem")
    If destination Then MessageBox.Show("destination")
    Dim destControlpnl As IntPtr = FindWindowEx(destination, Nothing, "TPanel", Nothing)
    destControlpnl = FindWindowEx(destination, Nothing, "TPanel", Nothing)
    If destControlpnl Then MessageBox.Show("destControlpnl")
    Dim destControl As IntPtr = FindWindowEx(destControlpnl, Nothing, "TPanel", Nothing)
    If destControl Then MessageBox.Show("destControl")

假设所有四个面板都是主面板 window 的直接子面板,您可以使用 FindWindowEx() 枚举它们,直到找到您感兴趣的面板。您这样做是利用 hwndChildAfter参数,如:

Dim destination As IntPtr = FindWindow("TDeviceMainForm", "Gem")
Dim destControlpnl As IntPtr = FindWindowEx(destination, Nothing, "TPanel", Nothing)
destControlpnl = FindWindowEx(destination, destControlpnl, "TPanel", Nothing)
destControlpnl = FindWindowEx(destination, destControlpnl, "TPanel", Nothing)

这假设面板是按主要 window 子级的 Z 顺序排列的。

也就是说,您提到的控件的命名约定表明 VCL 框架正在用于该应用程序的 UI。如果这是真的,VCL 用户通常的做法是清除 TPanel.Caption 属性,在这种情况下,您的搜索期间将没有可用的 window 名称。如果您在 Spy++ 中没有看到字符串 "Panel3" 作为所需 TPanel 的 window 名称,则无法通过 Win32 API 访问该 window 名称.您必须找到一些其他标准来验证您真正想要的 TPanel,例如寻找特定于 TPanel.

的孙子 window

但是,如果您确实看到 "Panel3" 作为 window 名称,则可以通过 Win32 API 访问它,这将大大简化您的搜索代码,将其简化为单个FindWindowEx() 使用其 lpszWindow 参数调用:

Dim destination As IntPtr = FindWindow("TDeviceMainForm", "Gem")
Dim destControlpnl As IntPtr = FindWindowEx(destination, Nothing, "TPanel", "Panel3")