我需要从Windows应用程序中抓取数据以在另一个程序中运行查询.有谁知道我在.NET中做这个的好起点?
您可能需要查看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().
查看ManagedSpy,提供源代码.(链接)