【问题标题】:How to get selected text from ANY window (using UI Automation) - C#如何从任何窗口中获取选定的文本(使用 UI 自动化) - C#
【发布时间】:2010-11-22 09:26:39
【问题描述】:

我有一个小托盘应用程序,它注册了一个系统范围的热键。当用户在任何应用程序中的任意位置选择文本并按下此热键时,我希望能够捕获所选文本。我目前正在使用 AutomationElements 执行此操作:

//Using FocusedElement (since the focused element should be the control with the selected text?)
AutomationElement ae = AutomationElement.FocusedElement;        
AutomationElement txtElement = ae.FindFirst(TreeScope.Subtree,Condition.TrueCondition);
if(txtElement == null)
    return;

TextPattern tp;

try
{
    tp = txtElement.GetCurrentPattern(TextPattern.Pattern) as TextPattern;
}
catch(Exception ex)
{
    return;
}

TextPatternRange[] trs;

if (tp.SupportedTextSelection == SupportedTextSelection.None)
{
    return;
            }
else
{
    trs = tp.GetSelection();
    string selectedText = trs[0].GetText(-1);
    MessageBox.Show(selectedText );

}

这适用于某些应用程序(例如记事本、Visual Studio 编辑框等),但不适用于所有应用程序(例如 Word、FireFox、Chrome 等)。

这里有人知道如何能够在任何应用程序中检索所选文本吗?

【问题讨论】:

  • 尽管下面说了些什么,记住只有应用程序实现了 Ctrl-C(或其他),剪贴板才会被填充;剪贴板不是解决方案

标签: c# .net automation ui-automation


【解决方案1】:

很遗憾,无法从任意应用程序中获取所选文本。 UI 自动化工作如果应用程序支持 UIA TextPattern;不幸的是,大多数人没有。我编写了一个尝试这样做的应用程序,并且有很多后备方案。

我试过了(差不多按顺序):

  1. UIA.TextPattern
  2. 特定于 Internet Explorer(这对 IE 6、7、8、9 有不同的实现)
  3. Adobe Reader 特定
  4. 剪贴板

这涵盖了 80-90% 的应用程序,但仍有不少应用程序失败。

请注意,恢复剪贴板有其自身的问题;一些应用程序(Office 等)将特定于供应商的信息放入剪贴板中,该剪贴板可以指向内部数据;当您将自己的信息放在剪贴板上时,内部数据会被释放,而当您放回旧数据时,剪贴板现在指向已释放的数据,从而导致崩溃。您可以通过仅保存/恢复已知的剪贴板格式来解决这个问题,但同样,这会导致应用程序行为“错误”而不是崩溃的奇怪行为。

【讨论】:

  • Adobe Reader 的具体实施效果如何?如果您有任何详细信息,请告诉我。
  • 我在 IE 中遇到问题,您能建议解决方案吗?
  • @ChintanPatel 这是几年前的事了,我的源代码已经丢失,所以我无能为力。
【解决方案2】:

UIA技术并非所有应用程序都支持,您可以尝试在某些情况下(如FF、Chrome等)使用MSAA,但仍然会得到很多问题。 最好的方法是保存当前剪贴板文本,通过 SendMessage WinAPI 函数发送“CTRL + C”按键消息,获取剪贴板文本,并恢复初始剪贴板文本,如 Rick 所说。

【讨论】:

  • 剪贴板连接需要保存,然后放回后缀。这并不总是那么容易。
  • 我尝试了您的方法,但未能从 Office Word 中捕获选定的文本。 :(stackoverflow.com/questions/25281314/…
【解决方案3】:

是否可以查看剪贴板并设置热键:CTRL+C?

您将无法从任何应用程序中读取选定的文本。例如,某些 PDF 文件包含不允许复制的受保护内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2015-12-15
    • 2015-12-05
    • 1970-01-01
    • 2011-01-16
    • 2010-10-05
    • 2023-03-10
    相关资源
    最近更新 更多