我有一个小托盘应用程序,它注册一个系统范围的热键。当用户在任何应用程序中的任何位置选择文本并按下此热键时,我希望能够捕获所选文本。我目前正在使用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 );
}
这适用于某些应用(例如记事本,视觉工作室编辑框等)但不适用于所有应用(例如Word,FireFox,Chrome等)。
此处有任何想法如何能够在任何应用程序中检索所选文本?
答案 0 :(得分:7)
不幸的是,没有办法从任意应用程序中获取所选文本。 UI自动化工作如果应用程序支持UIA TextPattern;不幸的是,大多数人没有。我写了一个试图做到这一点的应用程序,并且有一堆后备。
我试过(几乎按顺序):
这涵盖了80-90%的应用程序,但仍有不少仍未通过。
请注意,恢复剪贴板存在问题;某些应用程序(Office等)将特定于供应商的信息放入剪贴板,该剪贴板可以指向内部数据;当您将自己的信息放在剪贴板上时,内部数据会被释放,当您将旧数据放回原处时,剪贴板现在会指向释放的数据,从而导致崩溃。你可以通过仅保存/恢复已知的剪贴板格式来解决这个问题,但同样会导致奇怪的行为,即应用程序表现为“错误”而不是崩溃。
答案 1 :(得分:2)
UIA 技术,在某些情况下您可以尝试使用 MSAA (例如FF,Chrome等),但您仍会获得许多问题。 最好的方法是保存当前的剪贴板文本,通过 SendMessage WinAPI函数发送“CTRL + C”按键消息,获取剪贴板文本,并恢复初始剪贴板文本,如Rick所说。
答案 2 :(得分:1)
是否可以查看剪贴板并制作热键:CTRL + C?
您将无法从任何应用程序中读取所选文本。例如,某些PDF文件具有不允许复制的受保护内容。