是否可以获得任何窗口的选定文本,包括非 UI 自动化元素?
Posted
技术标签:
【中文标题】是否可以获得任何窗口的选定文本,包括非 UI 自动化元素?【英文标题】:Is it possible to get the selected text of any window including non-UI automation elements? 【发布时间】:2012-02-21 06:52:53 【问题描述】:是否可以获取任何窗口的选定文本,包括非 UI 自动化元素? 我希望能够获取任何进程的当前焦点元素的当前内容的选定文本。
我见过各种使用 UI 自动化来执行此操作的示例,但这仅适用于某些似乎最近在 .NET 中开发的应用程序。我需要能够获取任何窗口的文本。
我记得不久前,一个表现得像字典的应用程序,您可以在 Windows 中的任何位置用鼠标悬停在某些文本上,它会显示带有定义的工具提示。这可以在 C# 和 .NET 中实现吗?
我一直在使用 WinSpy 检查似乎不适用于 UIA 的窗口内容,ApplicationId 显示为空或“”。我猜 UIA 不支持这个特定的元素。当我使用 Notepad++ 进行测试时,我还注意到它使用了 Scintilla,这似乎也无法与 UIA 一起使用。
也许如果有人可以通过其他方法展示一种可靠的方法,我可以在我的应用程序中使用混合方法。使用 UIA 框架,如果这没有产生结果,那么它会退回到其他方法。
【问题讨论】:
没有100%可靠的方法。 从另一个程序中提取信息需要其他程序的合作。 (想一想:另一个程序如何从你的程序中提取信息?)公开文本内容的标准方法是通过 MSAA 或 UI 自动化。 使用 Win32Api 或 windows 挂钩怎么样?反正这个可以用吗? 【参考方案1】:实现此目的的一种简单方法是将CTRL + C
密钥代码发送到选定的窗口,然后您可以在剪贴板中找到选定的文本。这很容易实现。请参阅here 将密钥发送到其他进程,并参阅here 以读取剪贴板。缺点是您显然会丢失剪贴板内容。如果您寻找更可靠的解决方案check this question。
【讨论】:
更严重的问题:如果程序使用 Ctrl+C 来执行 Copy 以外的操作,那么您就有麻烦了。例如。将 Ctrl+C 发送到控制台程序通常会终止它。以上是关于是否可以获得任何窗口的选定文本,包括非 UI 自动化元素?的主要内容,如果未能解决你的问题,请参考以下文章