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

Posted

技术标签:

【中文标题】C#窗口应用程序从另一个应用程序的光标位置获取单词【英文标题】:C# window application get word from the cursor position from the other application 【发布时间】:2014-02-12 06:52:36 【问题描述】:

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

【问题讨论】:

一般情况下是做不到的。可能为特定应用程序执行此操作,但在全球范围内适用于所有应用程序的事情将非常困难。 yojr 用例是什么,你不能使用复制/粘贴吗? @EliAlgranti - 这是可能的,因为它的功能已经在“WordWeb”热键中实现。我可以使用复制/粘贴来获取选定的文本,但无法从光标位置获取文本。 我的用例就像我想在按下 HotKey 时从外部应用程序获取文本。 对不起,你是对的,正在考虑其他事情。您需要挂钩您的程序以接收 Windows 消息(请参阅***.com/questions/11361811/…),并且当您的热键被调用时,获取当前窗口并让它向您发送选定的文本。您可能需要 hack 来支持某些应用程序,因为并非所有应用程序都想玩。见***.com/questions/2251578/…。 RangeFromPoint 将为您提供光标处的文本。用ExpandToEnlosingUnit(Word)将其展开到光标处的单词。 【参考方案1】:

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

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

如果它不能解决您的问题,请按照 cmets 中的建议查看 http://msdn.microsoft.com/en-us/library/system.windows.automation.textpattern.getselection(v=vs.110).aspx。

【讨论】:

【参考方案2】:

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

具有讽刺意味的是,获取选定的文本稍微容易一些,尽管还不是 100%。我在this answer 中概述了一个解决方案。它确实涉及管理焦点和操纵剪贴板以获得最通用的解决方案,而且它绝不是完美的。

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

【讨论】:

【参考方案3】:

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

关于以下问题的 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?

【讨论】:

【参考方案4】:

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

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

【讨论】:

这应该是一条评论【参考方案5】:

您可以使用剪贴板复制或获取该文本,然后将其传输到您想要的窗口。

【讨论】:

【参考方案6】:

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

例如,你可以在你的程序中使用SendKeys.Send("^C"),然后是一个专注于Notepad++的代码,然后是SendKeys.Send("^V")

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

【讨论】:

【参考方案7】:

谢谢你的帮助。

我仍然无法从插入符号位置获取文本。所以最后我从活动窗口中获取所有文本并使用正则表达式获取我的文本。

    private string SelectText(IntPtr hWnd)
    
        string text = string.Empty;
        Regex regex = new Regex(@"(\d3-\w5,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;
    

【讨论】:

以上是关于C#窗口应用程序从另一个应用程序的光标位置获取单词的主要内容,如果未能解决你的问题,请参考以下文章

c# 动态获取当前屏幕中光标所在位置

如何在 Windows 窗体 C# 中伪造鼠标光标位置?

Python win32gui 获取窗口中虚拟光标的当前位置

WINAPI 光标在应用程序窗口上的点击位置

获取 SharpDX 中相对于窗口的鼠标位置

mfc 从另一个对话框更改对话框的光标