如何从任何窗口获取选定的文本(使用UI自动化) - C#

nel*_*shh 7 .net c# automation ui-automation

我有一个小托盘应用程序,它注册一个系统范围的热键.当用户在任何应用程序中的任何位置选择文本并按下此热键时,我希望能够捕获所选文本.我目前正在使用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 );

}
Run Code Online (Sandbox Code Playgroud)

这适用于某些应用程序(例如记事本,视觉工作室编辑框等)但不适用于所有应用程序(例如Word,FireFox,Chrome等).

这里的任何人都有任何关于如何在任何应用程序中检索所选文本的想法?

Eri*_*own 7

不幸的是,没有办法从任意应用程序中获取所选文本.如果应用程序支持UIA TextPattern, UI Automation可以工作; 不幸的是,大多数人没有.我写了一个试图做到这一点的应用程序,并且有一堆后备.

我尝试过(几乎按顺序):

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

这涵盖了80-90%的应用程序,但仍有相当多的应用程序失败.

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