如何在不使用剪贴板的情况下从活动应用程序中获取所选文本

时间:2011-04-03 20:20:35

标签: c#

我在做什么:

我的主要目的是在Win 7上启用用户友好的text to speech个人用途。方法应该适用于Google Chrome,VS和Eclipse。

代码示例:

以下代码为 ctrl + alt + space 创建全局键盘钩子, hookEvent。如果事件触发,它会开始/停止说出剪贴板内容(可以使用 ctrl + c 更新。

    /// <summary>
    /// KeyboardHook from: http://www.liensberger.it/web/blog/?p=207
    /// </summary>
    private readonly KeyboardHook hook = new KeyboardHook();
    private readonly SpeechSynthesizer speaker = //
        new SpeechSynthesizer { Rate = 3, Volume = 100 };

    private void doSpeaking(string text)
    {
        // starts / stops speaking, while not blocking UI
        if (speaker.State != SynthesizerState.Speaking)
            speaker.SpeakAsync(text);
        else
            speaker.SpeakAsyncCancelAll();
    }
    private void hookEvent(object sender, KeyPressedEventArgs e)
    {
        this.doSpeaking(Convert.ToString(Clipboard.GetText()));
    }
    public Form1()
    {
        InitializeComponent();
        hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(hookEvent);
        hook.RegisterHotKey(ModifierKeysx.Control|ModifierKeysx.Alt, Keys.Space);
    }

问题:

我不想使用剪贴板。或者至少在之后恢复价值,例如:

    [MethodImpl(MethodImplOptions.Synchronized)]
    private string getSelectedTextHACK()
    {
        object restorePoint = Clipboard.GetData(DataFormats.UnicodeText);
        SendKeys.SendWait("^c");
        string result = Convert.ToString(Clipboard.GetText());
        Clipboard.SetData(DataFormats.UnicodeText, restorePoint);

        return result;
    }

我有什么选择?

编辑:

令我惊讶的是,我发现我的剪贴板阅读器是最好的方法。我创建了一个通知区域应用程序,响应左键单击(说出剪贴板)并右键单击(菜单打开)。在菜单中,用户可以快速,说话或创建音频文件。

2 个答案:

答案 0 :(得分:0)

MS提供的辅助功能工具可以涵盖您尝试执行的操作。如果您查看有关屏幕抓取的文档。简而言之,每个组件都可以通过某种方式访问​​,如果您使用一些Windows调试工具,您可以查看其中的组件名称/结构。然后,您可以使用它,因为它很复杂,因为大多数情况下您需要非常具体地针对您打算从中删除的每个应用程序。

如果你设法刮掉你不需要使用剪贴板,因为你可以直接访问应用程序的文本属性。这不是我必须要做的事情,因此,我没有代码提供我的头脑,但术语“屏幕抓取”应该指向正确的方向。

答案 1 :(得分:0)

如果要稍微扩展一下Bugfinder的说法,微软提供商UI Automation Framework来解决你提到的问题:

特别是您可以使用TextSelectionChangedEventTextPattern

此解决方案的问题在于它仅适用于受支持的操作系统和应用程序 - 并非所有人都支持此操作。

您的剪贴板解决方案适用于无法提供良好自动化界面的应用程序。 但对于许多应用程序,UI自动化框架将运行良好,并将为您提供更好的解决方案。