【问题标题】:Screen-scraping a windows application in c# [closed]在 C# 中截屏 Windows 应用程序 [关闭]
【发布时间】:2010-09-27 08:51:45
【问题描述】:

我需要从 Windows 应用程序中抓取数据以在另一个程序中运行查询。有谁知道我在 .NET 中执行此操作的良好起点?

【问题讨论】:

    标签: c# .net screen-scraping


    【解决方案1】:

    您可能想查看WM_GETTEXT message。这可以是used to read text from other windows——它是 Windows API 的一个古老部分,如果您使用 C#,则需要为它 p/invoke。

    查看this page 以获取在 C# 中执行此操作的示例。

    基本上,您首先通过 FindControlEx() 获取所需窗口的句柄(通过标题)。

    其次,您使用 EnumChildWindows() 递归地枚举该窗口上的控件,以查找该窗口的所有子控件以及所有这些子控件的子控件,直到您获得目标窗体的完整映射。

    这是来自 Google Answers 的 Theta-ga's excellent explanation 的选定部分:

    要获取任何文本框或列表框控件的内容,我们只需要它的窗口句柄即可。如果您已经获得了窗口句柄,请转到说明的第 2 部分。

    第 1 部分:获取控制句柄

    • 要获得一个控件的句柄,我们首先要获得它的父窗口的句柄。我们可以通过使用 Win32 FindControlEx() 方法来做到这一点。此方法接受窗口标题(如“计算器”)和/或其类名,并返回其句柄。
    • 一旦我们有了父窗口句柄,我们就可以调用 Win32 EnumChildWindows 方法。此方法接受一个回调方法,它使用为指定父项找到的每个子控件的句柄调用该方法。例如,如果我们用计算器窗口的句柄调用这个方法,它会用文本框控件的句柄调用回调方法,然后再用计算器窗口上每个按钮的句柄调用回调方法,以此类推.
    • 由于我们只对文本框控件的句柄感兴趣,我们可以在回调方法中查看窗口的类。 Win32 方法 GetClassName() 可用于此。这个方法接受一个窗口句柄,并为我们提供一个包含类名的字符串。所以一个文本框属于?编辑?类,“ListBox”类的列表框等等。一旦确定您拥有正确控件的句柄,就可以读取其内容。

    第 2 部分:读取控件的内容

    • 您可以使用 Win32 SendMessage() 函数读取控件的内容,并使用它将 WM_GETTEXT 消息传递给目标控件。这将为您提供控件的文本内容。此方法适用于文本框、按钮或静态控件。
    • 但是,如果您尝试读取列表框的内容,上述方法将失败。要获取列表框的内容,我们需要首先使用带有 LB_GETCOUNT 消息的 SendMessage() 来获取列表项的计数。然后我们需要为列表中的每个项目调用带有 LB_GETTEXT 消息的 SendMessage()。

    【讨论】:

    • 感谢您提供这些有用的信息。快速提问,如果我有矩形坐标(即 x、y、宽度、高度)——我有兴趣从该矩形中获取文本,不一定是像文本框/区域这样的窗体控件。你知道这是否可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多