您好我正在尝试处理外部程序中的控件。我可以获得主窗体句柄然后是面板句柄,但我无法确定哪个面板我得到了句柄,因为有4个面板显示使用间谍++
我知道如果我可以通过使用实例选择面板,这将允许我选择我想要的面板。我想选择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")
答案 0 :(得分:1)
假设所有四个面板都是主窗口的直接子节点,您可以使用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)
这假设面板按主窗口子女的Z顺序顺序排列。
话虽如此,您提到的控件的命名约定表明VCL框架正在用于该应用程序的UI。如果确实如此,VCL用户通常会清除TPanel.Caption
属性,在这种情况下,搜索期间不会有可用的窗口名称。如果在Spy ++中没有看到字符串"Panel3"
作为所需TPanel
的窗口名称,则无法通过Win32 API访问该窗口名称。您必须找到一些其他条件来验证您真正想要的TPanel
,例如查找特定于该TPanel
的孙子窗口。
但是,如果你确实看到"Panel3"
作为窗口名称,那么可以通过Win32 API访问它,这将通过使用{{{} {{}}来大大简化您的搜索代码到一个FindWindowEx()
调用{1}}参数:
lpszWindow