Cómo obtener el texto seleccionado de una aplicación activa, sin usar un portapapeles
Mi intención principal es permitir que el usuario sea amigabletext to speech
para uso personal en Win 7. El enfoque debería funcionar en Google Chrome, VS y Eclipse.
l siguiente código crea un enlace de teclado global paractrl
+ alt
+ space
, llamado hookEvent. Si se dispara el evento, comienza / deja de hablar del contenido del portapapeles (que se puede actualizar conctrl
+ 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);
}
PreguntaPreferiría no usar el portapapeles. O al menos, restaurando el valor después, algo como:
[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;
}
¿Cuáles son mis opciones
Editar
Para mi sorpresa, descubrí que mi lector de portapapeles es la mejor manera de hacerlo. Creé una aplicación de área de notificación, que responde al clic izquierdo (portapapeles) y al botón derecho (se abre el menú). En el menú, el usuario puede acelerar, hablar o crear un archivo de audio.