Como obter o texto selecionado de um aplicativo ativo, sem usar uma área de transferência
A minha principal intenção é permitir uma utilização amigáveltext to speech
para uso pessoal no Win 7. A abordagem deve funcionar no Google Chrome, VS e Eclips
O código a seguir cria um gancho de teclado global paractrl
+ alt
+ space
, chamado hookEvent. Se o evento for disparado, ele inicia / pára de falar o conteúdo da área de transferência (que pode ser atualizado comctrl
+ 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);
}
QuestãoEu preferiria não usar a área de transferência. Ou pelo menos, restaurando o valor depois, 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;
}
Quais são minhas opções?
Editar
Para minha surpresa, descobri que o leitor da área de transferência é o melhor caminho a percorrer. Criei um aplicativo da área de notificação, que responde ao clique esquerdo (área de transferência) e clique com o botão direito (o menu é aberto). No menu, o usuário pode acelerar, falar ou criar um arquivo de áudi