【问题标题】:In a windows application, how to check and retrieve(if any) selected text/image from any window?在 Windows 应用程序中,如何从任何窗口检查和检索(如果有)选定的文本/图像?
【发布时间】:2010-12-26 05:23:56
【问题描述】:

我有一个 Windows 应用程序,它应该不断跟踪活动的应用程序窗口。

我还没有尝试过,但我四处搜索,发现这可以通过使用 windows API (user32.dll) 来完成 - GetForegroundWindow()

但是,我的要求还需要应用程序在活动窗口中查找任何选定的文本或图像(可能是文档、pdf、电子邮件、浏览器、mspaint 等)。我不知道该怎么做。是否可以在活动窗口中查找选定的文本或图像,如果找到,是否可以将其检索到我的应用程序并使用?

我猜测如果获得了选定的文本/图像,那么我可以将其复制到剪贴板并从我的应用程序中使用它,因为所有应用程序都可以访问剪贴板。

有什么想法吗?任何替代/更好的方法来做到这一点?

【问题讨论】:

  • 我确实浏览了这些线程。事实上,这是我了解到我必须使用 user32.dll - GetForegroundWindow() 来获取活动窗口等的地方。除了其中一个是 Python 线程,我试图从中尽可能多地理解。另一个 c# 线程确实有一些我现在正在尝试实现的答案。但是,他们只谈论选定的文本。我需要知道是否也可以使用图像处理类似的行。

标签: c# windows


【解决方案1】:

是的GetForegroundWindow() 是您获取活动窗口的方式。

我认为你可能对你想做的事情有困难。每个窗口由许多子窗口组成。您需要获取任何这些子窗口的文本。

这类工作通常使用名为 spy++ 的工具完成。您可以发现窗口层次结构,然后使用 Win32 API FindWindowEx 获取子窗口。

例如,您可以使用 WM_GETTEXT 消息获取 windows 文本。

    [DllImport("user32.dll", EntryPoint="SendMessage")]
    public static extern int SendMessageForGetText(int hwnd, int msg, int wParam, StringBuilder sb);
    const int WM_GETTEXT = 0x000D; 

不过,我不确定您是否能够找到解决问题的通用方法。您可能需要每个应用程序处理。


根据您要执行的操作,您可以发送消息以发送 Ctrl + C。然后检查剪贴板中的内容。


您还可以使用Active Accessibility SDK 找到解决方案或部分解决方案。

【讨论】:

  • 所以我可能必须为每个应用程序单独处理这些。我使用并具有类似实现(但只有文本)的一个应用程序是 wordweb。 wordweb 的效果非常好。有没有人知道它是如何在 wordweb 中完成的。我不确定,但我觉得为每个应用程序单独处理这些听起来非常详尽。
  • 我不知道那个程序,抱歉。我认为你最好的选择是研究主动无障碍 SDK。
【解决方案2】:

不同的程序(甚至是同一程序的不同部分)在内部以不同的方式表示和处理选择。在许多应用程序中,可以在多个控件中选择某些内容。大多数文本框通常是相当标准的,但许多具有更高级文本编辑功能的应用程序使用的自定义文本框不会以相同的方式工作。不同的 PDF 查看器会有不同的工作方式,不同的图形应用程序会有不同的工作方式,等等。

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多