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

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

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

【问题讨论】:

    标签: c# .net winapi ui-automation


    【解决方案1】:

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

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

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

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

    【讨论】:

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