使用 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")
您好,我正在尝试获取外部程序中控件的句柄。我可以获得主窗体句柄,然后是面板句柄,但无法确定我正在获取哪个面板的句柄,因为有 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
.
但是,如果您确实看到 "Panel3"
作为 window 名称,则可以通过 Win32 API 访问它,这将大大简化您的搜索代码,将其简化为单个FindWindowEx()
使用其 lpszWindow
参数调用:
Dim destination As IntPtr = FindWindow("TDeviceMainForm", "Gem")
Dim destControlpnl As IntPtr = FindWindowEx(destination, Nothing, "TPanel", "Panel3")