关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。












想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic

去年关闭。



Improve this question




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

最佳答案

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

  • 第 2 部分:读取控件的内容
  • 您可以使用 Win32 SendMessage() 函数读入控件的内容,并使用它来将 WM_GETTEXT 消息传递给目标控件。这将为您提供控件的文本内容。此方法适用于文本框、按钮或静态控件。
  • 但是,如果您尝试读取列表框的内容,上述方法将失败。要获取列表框的内容,我们需要首先使用带有 LB_GETCOUNT 消息的 SendMessage() 来获取列表项的计数。然后我们需要为列表中的每个项目使用 LB_GETTEXT 消息调用 SendMessage()。
  • 关于c# - 在 c# 中屏幕抓取 Windows 应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/375117/

    10-16 10:04