我需要从 Windows 应用程序中抓取数据以在另一个程序中运行查询。有谁知道我在 .NET 中执行此操作的一个很好的起点?
Tony Boarman
问问题
28317 次
1 回答
16
您可能想查看WM_GETTEXT 消息。这可用于从其他窗口读取文本——它是 Windows API 的一个古老部分,如果您使用 C#,则需要为它 p/invoke。
查看此页面以获取在 C# 中执行此操作的示例。
基本上,您首先 FindControlEx() 来获取您想要的窗口句柄(通过标题)。
其次,您使用 EnumChildWindows() 递归地枚举该窗口上的控件,以查找该窗口的所有子控件以及所有这些子控件的子控件,直到您获得目标窗体的完整映射。
以下是来自 Google Answers的Theta-ga 出色解释的一部分:
要获取任何文本框或列表框控件的内容,我们只需要它的窗口句柄。如果您已经获得了窗口句柄,请转到说明的第 2 部分。
第 1 部分:获取控制句柄
- 要获得一个控件的句柄,我们首先要获得它的父窗口的句柄。我们可以通过使用 Win32 FindControlEx() 方法来做到这一点。此方法接受窗口标题(例如“计算器”)和/或其类名,并返回其句柄。
- 一旦我们有了父窗口句柄,我们就可以调用 Win32 EnumChildWindows 方法。此方法接受一个回调方法,它使用为指定父项找到的每个子控件的句柄调用该方法。例如,如果我们用计算器窗口的句柄调用这个方法,它会用文本框控件的句柄调用回调方法,然后再用计算器窗口上每个按钮的句柄调用回调方法,以此类推.
- 由于我们只对文本框控件的句柄感兴趣,我们可以在回调方法中查看窗口的类。Win32 方法 GetClassName() 可用于此。这个方法接受一个窗口句柄,并为我们提供一个包含类名的字符串。所以一个文本框属于?编辑?类,“ListBox”类的列表框等等。一旦您确定您拥有正确控件的句柄,您就可以阅读其内容。
第 2 部分:读取控件的内容
- 您可以使用 Win32 SendMessage() 函数读取控件的内容,并使用它将 WM_GETTEXT 消息传递给目标控件。这将为您提供控件的文本内容。此方法适用于文本框、按钮或静态控件。
- 但是,如果您尝试读取列表框的内容,上述方法将失败。要获取列表框的内容,我们需要首先使用带有 LB_GETCOUNT 消息的 SendMessage() 来获取列表项的计数。然后我们需要为列表中的每个项目调用带有 LB_GETTEXT 消息的 SendMessage()。
于 2008-12-17T16:40:08.467 回答