我有C#窗口应用程序,我想获取光标当前所在的文本或从其他应用程序中选择文本,如记事本,记事本++或任何浏览器等。
答案 0 :(得分:1)
您已经看过这个CodeProject article了吗?这可能是一个开始,即使这不是您正在寻找的。 p>
请参阅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。
答案 1 :(得分:1)
获取光标(或插入符号)下的文本需要来自应用程序的UI Automation和TextPattern支持。问题是并非所有应用程序都支持这一点,并且应用程序越旧,TextPattern支持的可能性就越小。
具有讽刺意味的是,获取所选文本会更容易一些,尽管仍然不是100%。我在this answer中概述了一个解决方案。它确实涉及管理焦点和操纵剪贴板以获得最通用的解决方案,而且它绝不是完美的。
另一个涉及 ton 工作的选项是使用mirror driver来捕获屏幕内容,然后使用其他技术(OCR等)来捕获文本。我不是真的推荐这个;它在Windows 8及更高版本中不受支持,但如果你必须在影响最小的应用程序中获得100%的支持,那么它就有可能。不过,这是很多的工作。绝对不是为了娇气。
答案 2 :(得分:1)
使用辅助功能技术(如屏幕阅读器)可以实现这一点。但是,它需要进行大量的故障排除:
关于以下问题的MSAA答案是您需要开始的地方。
Best way to get the 'word before the cursor' in any open app's text field
此外,以下问题有助于实施它:
答案 3 :(得分:1)
问题是您正在尝试从其他应用程序获取数据。除非该应用程序支持向您提供此方法,否则将非常困难。
如果可以从应用程序中检索信息会更容易,例如从表单上的文本框或富文本控件中检索
答案 4 :(得分:0)
您可以使用剪贴板复制或获取该文本,然后将其传输到所需的窗口。
答案 5 :(得分:0)
您可以使用SendKeys
课来演示键盘。
例如,您可以在程序中使用SendKeys.Send("^C")
,然后使用代码专注于Notepad ++,然后使用SendKeys.Send("^V")
。
SendKeys.Send("^C");
// code to change active window and focus on Notepad++.
SendKeys.Send("^V");
答案 6 :(得分:0)
感谢您的帮助。
我仍然无法从插入符号位置获取文本。所以最后我从活动窗口获取所有文本并使用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;
}