C#窗口应用程序从其他应用程序的光标位置获取单词

我有C#窗口应用程序,我想获取光标当前所在的文本或从其他应用程序中选择文本,如记事本,记事本++或任何浏览器等。

你有没看过这个CodeProject文章 ? 这可能是一个开始,即使这不是您正在寻找的。

请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms632604(v=vs.85).aspx 。

如果它没有解决您的问题,请查看http://msdn.microsoft.com/en-us/library/system.windows.automation.textpattern.getselection(v=vs.110).aspx ,如评论。

获取光标(或插入符号)下的文本需要来自应用程序的UI自动化和TextPattern支持。 问题是并非所有应用程序都支持这一点,并且应用程序越旧,拥有TextPattern支持的可能性就越小。

具有讽刺意味的是,获取所选文本会更容易一些,尽管仍然不是100%。 我在这个答案中概述了一个解决方案 它确实涉及管理焦点和操纵剪贴板以获得最通用的解决方案,并且它绝不是完美的。

另一个涉及大量工作的选择是使用镜像驱动程序捕获屏幕内容,然后使用其他技术(OCR等)来捕获文本。 我不是真的推荐这个; 它在Windows 8及更高版本中不受支持,但如果您必须在影响最小的应用程序之间获得100%支持,那么这是可能的。 不过,这是一项很多工作。 绝对不是为了娇气。

这可以使用辅助function技术(如屏幕阅读器)。 但是,它需要大量的故障排除:

关于MSAA关于以下问题的答案是您需要开始的地方。

在任何打开的应用程序的文本字段中获取“光标前的单词”的最佳方法

此外,以下问题有助于实现它:

如何在Windows中的光标下获取单词?

问题是您正在尝试从另一个应用程序获取数据。 除非该应用程序支持向您提供此方法,否则将非常困难。

如果可以从应用程序中检索信息会更容易,例如从表单上的文本框或富文本控件中检索

您可以使用clipborad复制或获取该文本,然后将其传输到所需的窗口。

您可以使用SendKeys类演示键盘。

例如,您可以在程序中使用SendKeys.Send("^C") ,然后使用代码将注意力集中在Notepad ++和SendKeys.Send("^V")

 SendKeys.Send("^C"); // code to change active window and focus on Notepad++. SendKeys.Send("^V"); 

谢谢你的帮助。

我仍然无法从插入位置获取文本。 所以最后我从活动窗口获取所有文本并使用Regex获取我的文本。

  private string SelectText(IntPtr hWnd) { string text = string.Empty; Regex regex = new Regex(@"(\d{3}-\w{5,8})"); if (InputSimulator.IsKeyDown(VirtualKeyCode.SHIFT)) { InputSimulator.SimulateKeyUp(VirtualKeyCode.SHIFT); } if (InputSimulator.IsKeyDown(VirtualKeyCode.MENU)) { InputSimulator.SimulateKeyUp(VirtualKeyCode.MENU); } InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C); text = Clipboard.GetText(); if (!string.IsNullOrEmpty(text) && regex.IsMatch(text)) { Thread.Sleep(100); text.Trim(); string[] textArr = text.Split(' '); text = textArr[textArr.Length - 1]; } else { InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_A); InputSimulator.SimulateModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C); ClickOnPoint(); Thread.Sleep(100); text = Clipboard.GetText(); MatchCollection matchCollection = regex.Matches(text); if (matchCollection.Count > 0) { text = matchCollection[0].Value; } else { text = string.Empty; } } Clipboard.Clear(); return text; }