当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在c#中屏幕抓取一个windows应用程序》经验,为你挑选了2个好方法。

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



1> HanClinto..:

您可能需要查看WM_GETTEXT消息.这可以用来从其他窗口读取文本 - 它是Windows API的一个古老部分,如果你在C#中,你需要p/invoke它.

查看此页面以获取在C#中执行此操作的示例.

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

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

以下是来自Google Answers 的Theta-ga优秀解释的精选部分:

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

第1部分:获得控制手柄

要获取控件的句柄,我们首先获取它的父窗口的句柄.我们可以使用Win32 FindControlEx()方法完成此操作.此方法接受窗口标题(例如"计算器")和/或其类名,并返回其句柄.

一旦我们有了父窗口句柄,我们就可以调用Win32 EnumChildWindows方法.此方法接受一个回调方法,它使用它为指定父级找到的每个子控件的句柄调用它.例如,如果我们使用Calculator窗口的句柄调用此方法,它将使用文本框控件的句柄调用回调方法,然后再使用Calculator窗口中每个按钮的句柄调用,依此类推.

由于我们只对文本框控件的句柄感兴趣,因此我们可以在回调方法中检查窗口的类.Win32方法GetClassName()可用于此目的.此方法接受窗口句柄并为我们提供包含类名的字符串.所以文本框属于?编辑?class,"ListBox"类的列表框,依此类推.一旦确定拥有正确控制的句柄,就可以阅读其内容.

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

您可以使用Win32 SendMessage()函数读取控件的内容,并使用它将WM_GETTEXT消息传递给目标控件.这将为您提供控件的文本内容.此方法适用于文本框,按钮或静态控件.

但是,如果您尝试读取列表框的内容,则上述方法将失败.要获取列表框的内容,我们需要首先使用带有LB_GETCOUNT消息的SendMessage()来获取列表项的计数.然后我们需要为列表中的每个项目使用LB_GETTEXT消息调用SendMessage().



2> Cédric Guill..:

查看ManagedSpy,提供源代码.(链接)

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有