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

我在做什么:

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

代码示例:

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

  ///  /// KeyboardHook from: http://www.liensberger.it/web/blog/?p=207 ///  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(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; } 

我有什么选择?

编辑:

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

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

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

如果要扩展一下Bugfinder所说的内容,微软提供了一个UI自动化框架来解决你提到的问题:

特别是你可以使用TextPattern的TextSelectionChangedEvent :

该解决方案的问题在于它仅适用于支持的操作系统和应用程序 – 并非所有人都支持这一点。

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