在c#中屏幕抓取一个windows应用程序

时间:2008-12-17 16:22:50

标签: c# .net screen-scraping

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

5 个答案:

答案 0 :(得分:16)

您可能需要查看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方法。此方法接受一个回调方法,它使用它为指定父级找到的每个子控件的句柄调用它。例如,如果我们使用Calculator窗口的句柄调用此方法,它将使用文本框控件的句柄调用回调方法,然后再使用Calculator窗口中每个按钮的句柄调用,依此类推
  • 由于我们只对文本框控件的句柄感兴趣,我们可以在回调方法中检查窗口的类。 Win32方法GetClassName()可用于此目的。此方法接受窗口句柄并为我们提供包含类名的字符串。所以文本框属于?编辑? class,“ListBox”类的列表框,依此类推。一旦确定拥有正确控制的句柄,就可以阅读其内容。

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

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

答案 1 :(得分:8)

查看ManagedSpy,提供源代码。 (link

答案 2 :(得分:0)

“您可以使用System.Diagnostics.Process.GetProcessesByName(”ProcName“)和 检索主窗口句柄,从那里你可以使用win32 API 获取用于显示所需文本的文本框的句柄。 使用文本框的句柄,您可以获取或设置内容。我是 没有与win32 API的高手,但我已经能够进行一些研究 完成类似的任务。 希望这有助于“

从这里采取:http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic1657.aspx

答案 3 :(得分:0)

将The Wheel编成一篇关于他如何从扑克申请中获取信息的文章。

检查:deconstructing-the-poker-client-1。这可能会有所帮助。

答案 4 :(得分:0)

screenscraperstudio.com

它创建了“你的刮刀对话框”的VB代码。

我还没有购买它,所以我可能是错的,但它是唯一的方法(没有使用Spy ++消息传递你自己的其他躲到上面......)