C#窗口应用程序从另一个应用程序的光标位置获取单词
我有一个C#window应用程序,我想从光标当前所在的位置获取文本,或者从其他应用程序(如记事本、记事本++或任何浏览器等)中选择文本。您已经看过了吗?这可能是一个开始,即使这并不是你想要的 看C#窗口应用程序从另一个应用程序的光标位置获取单词,c#,.net,winapi,C#,.net,Winapi,我有一个C#window应用程序,我想从光标当前所在的位置获取文本,或者从其他应用程序(如记事本、记事本++或任何浏览器等)中选择文本。您已经看过了吗?这可能是一个开始,即使这并不是你想要的 看 如果它不能解决您的问题,请按照评论中的建议查看。您已经查看过了吗?这可能是一个开始,即使这并不是你想要的 看 如果它不能解决您的问题,请查看注释中的建议。获取光标下的文本(或插入符号)需要应用程序的支持。问题是,并非所有应用程序都支持此功能,而且应用程序越老,支持TextPattern的可能性就越小 具
如果它不能解决您的问题,请按照评论中的建议查看。您已经查看过了吗?这可能是一个开始,即使这并不是你想要的 看
如果它不能解决您的问题,请查看注释中的建议。获取光标下的文本(或插入符号)需要应用程序的支持。问题是,并非所有应用程序都支持此功能,而且应用程序越老,支持TextPattern的可能性就越小 具有讽刺意味的是,获取选定文本稍微容易一些,尽管还不是100%。我在报告中概述了一个解决方案。它确实涉及到管理焦点和操纵剪贴板以获得最通用的解决方案,而且它绝不是完美的
另一个涉及大量工作的选项是使用一个捕获屏幕内容,然后使用其他技术(OCR等)捕获文本。我真的不推荐这个;Windows 8及更高版本不支持它,但如果您必须在影响最小的应用程序中获得100%的支持,那么这是一种可能性。不过,这需要做很多工作。绝对不适合神经过敏的人。获取光标下的文本(或插入符号)需要应用程序的支持。问题是,并非所有应用程序都支持此功能,而且应用程序越老,支持TextPattern的可能性就越小 具有讽刺意味的是,获取选定文本稍微容易一些,尽管还不是100%。我在报告中概述了一个解决方案。它确实涉及到管理焦点和操纵剪贴板以获得最通用的解决方案,而且它绝不是完美的
另一个涉及大量工作的选项是使用一个捕获屏幕内容,然后使用其他技术(OCR等)捕获文本。我真的不推荐这个;Windows 8及更高版本不支持它,但如果您必须在影响最小的应用程序中获得100%的支持,那么这是一种可能性。不过,这需要做很多工作。绝对不适合那些胆小鬼。这可以通过可访问性技术(如屏幕阅读器)实现。但是,它需要大量的故障排除: 关于MSAA的以下问题的答案是您需要从哪里开始 此外,以下问题有助于实施该计划:
这可以通过可访问性技术(如屏幕阅读器)实现。但是,它需要大量的故障排除: 关于MSAA的以下问题的答案是您需要从哪里开始 此外,以下问题有助于实施该计划:
问题在于您试图从另一个应用程序获取数据。除非该应用程序支持一种向您提供此功能的方法,否则将非常困难
如果可以从应用程序中检索信息,例如从文本框或表单上的富格文本控件中检索信息,则会容易得多。问题是您正试图从另一个应用程序中获取数据。除非该应用程序支持一种向您提供此功能的方法,否则将非常困难
如果可以从应用程序中检索信息,那就容易多了,与表单上的文本框或富文本控件类似,您可以使用Clipboard复制或获取该文本,然后将其传送到所需窗口。您可以使用Clipboard复制或获取该文本,然后将其传送到所需窗口。您可以使用
SendKeys
类演示键盘
例如,您可以在程序中使用SendKeys.Send(“^C”)
,然后使用一段代码来关注记事本+,然后使用SendKeys.Send(“^V”)
您可以使用
SendKeys
类演示键盘
例如,您可以在程序中使用SendKeys.Send(“^C”)
,然后使用一段代码来关注记事本+,然后使用SendKeys.Send(“^V”)
谢谢你的帮助
我仍然无法从插入符号位置获取文本。最后,我从活动窗口获取所有文本,并使用正则表达式获取文本
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;
}
谢谢你的帮助
我仍然无法从插入符号位置获取文本。最后,我从活动窗口获取所有文本,并使用正则表达式获取文本
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;
}
一般来说,这样做是不可能的。对于一个特定的应用程序来说,这样做是可能的,但是对于所有的应用程序来说,要在全局范围内工作是非常困难的。yojr用例是什么?你不能使用复制/粘贴吗?@EliAlgranti-这是可能的,因为它的功能已经在“WordWeb”热键中实现了。我可以使用“复制/粘贴”来获取所选文本,但无法从光标位置获取文本。我的使用情况就像我想在按下热键时从外部应用程序获取文本一样。很抱歉,您是对的,我在想其他事情。您需要挂接程序以接收windows消息(请参阅),当调用热键时,请抓住当前窗口并让它向您发送所选文本。您可能需要黑客来支持某些应用程序,因为并非所有的应用程序都想玩游戏。看见将在光标处获取文本。使用
ExpandToEnlosingUnit(word)
将其展开到光标处的单词。通常不可能这样做。对于一个特定的应用程序来说,这样做是可能的,但是对于所有的应用程序来说,要在全局范围内工作是非常困难的。什么是yojr用例?你不能使用复制/粘贴吗?@EliAlgranti-这是poss