从窗口句柄获取自定义 .NET 类的组件类型

Posted

技术标签:

【中文标题】从窗口句柄获取自定义 .NET 类的组件类型【英文标题】:Get component type of custom .NET class from window handle 【发布时间】:2010-10-11 10:16:09 【问题描述】:

我需要查看另一个进程中单击的控件的组件类型,即已编程类的名称。我需要该类型,以便对单击的控件做出反应,然后执行一些自动化任务。 现在我正在做以下事情: 1.我从Win32的FindWindow()中找到进程的主窗口句柄。 2. 然后,我调用 EnumChildWindows(),同样来自 Win32,并获取主窗口句柄的所有子窗口句柄。 3. 现在变得棘手了。当我调用 GetClassName() 时,它返回 WindowsForms10.STATIC.app [...],因为我试图读取的控件是自定义的。

如何使用 EnumChildWindows() 中的窗口句柄获取单击控件的类型?我想要做的甚至可能吗? 我一直在研究将 Win32 中的 SendMessage() 用于该过程,但似乎没有系统定义的消息可以提供帮助。

【问题讨论】:

【参考方案1】:

恐怕这是不可能的。句柄只是指 Windows 需要的窗口的内部数据。没有可用的信息。

你可以得到类名,但它既不标准化也不唯一。大多数不是基本功能控件(如按钮、列表等)的控件都派生自一个非常原始的控件,即“静态”。但同样,没有关于可用的高级 WinForms 控件的信息。

这导致这样一个事实,即使您知道类型,也不能只转换指针/句柄,因为它后面没有数据。

你能以某种方式重申你的问题吗?也许使用远程过程调用?没有高级 WinForms 对象是否可以工作?点击、移动或重命名等操作使用普通的 Win32 API。

【讨论】:

非常感谢您的快速答复。我在 Win32 API 中阅读了很多内容,但没有运气。 :( 我需要查看***类,这样我就可以预测用户正在尝试做什么。我不需要进一步与控件交互。我编写了一个 Hook 来读取应用程序中鼠标的位置。然后我需要做的是读取单击了哪个组件类型。转换为 AutomationElement 也没有帮助,因为属性设置不正确。我看到 ManagedSpyLib 可以读取组件类型,但它尚未编译为 . NET 4.0,所以我需要自己编程。 如果您发现有用的答案,您可以点击向上箭头。如果它回答了您的问题,请点击箭头下方的绿色复选标记。

以上是关于从窗口句柄获取自定义 .NET 类的组件类型的主要内容,如果未能解决你的问题,请参考以下文章

Qt:子窗口中如何获取主窗体ui中的控件

vb.net中如何获得某个窗口的句柄

Delphi取所有窗口句柄

从没有GetWindowThreadProcessId的窗口句柄中获取进程ID(c#.net 4.0)

无法在 MFC 无窗口 Activex 中获取 Cwnd 类的句柄?

VC获取自身窗口句柄