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

时间:2014-01-22 09:37:13

标签: c# .net winapi

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

7 个答案:

答案 0 :(得分:1)

您已经看过这个CodeProject article了吗?这可能是一个开始,即使这不是您正在寻找的。

请参阅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 AutomationTextPattern支持。问题是并非所有应用程序都支持这一点,并且应用程序越旧,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

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

How to get the word under the cursor in Windows?

答案 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;
    }