C#窗口应用程序从另一个应用程序的光标位置获取单词

C#窗口应用程序从另一个应用程序的光标位置获取单词,c#,.net,winapi,C#,.net,Winapi,我有一个C#window应用程序,我想从光标当前所在的位置获取文本,或者从其他应用程序(如记事本、记事本++或任何浏览器等)中选择文本。您已经看过了吗?这可能是一个开始,即使这并不是你想要的 看 如果它不能解决您的问题,请按照评论中的建议查看。您已经查看过了吗?这可能是一个开始,即使这并不是你想要的 看 如果它不能解决您的问题,请查看注释中的建议。获取光标下的文本(或插入符号)需要应用程序的支持。问题是,并非所有应用程序都支持此功能,而且应用程序越老,支持TextPattern的可能性就越小 具

我有一个C#window应用程序,我想从光标当前所在的位置获取文本,或者从其他应用程序(如记事本、记事本++或任何浏览器等)中选择文本。

您已经看过了吗?这可能是一个开始,即使这并不是你想要的


如果它不能解决您的问题,请按照评论中的建议查看。

您已经查看过了吗?这可能是一个开始,即使这并不是你想要的


如果它不能解决您的问题,请查看注释中的建议。

获取光标下的文本(或插入符号)需要应用程序的支持。问题是,并非所有应用程序都支持此功能,而且应用程序越老,支持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