2010-11-22 5 views
7

Ho una piccola applicazione per il vassoio che registra un tasto di scelta rapida del sistema. Quando l'utente seleziona un testo in qualsiasi applicazione e preme questo tasto di scelta rapida, desidero essere in grado di acquisire il testo selezionato. Attualmente sto facendo questo utilizzando AutomationElements:Come ottenere il testo selezionato da QUALSIASI finestra (usando l'automazione dell'interfaccia utente) - C#

//Using FocusedElement (since the focused element should be the control with the selected text?) 
AutomationElement ae = AutomationElement.FocusedElement;   
AutomationElement txtElement = ae.FindFirst(TreeScope.Subtree,Condition.TrueCondition); 
if(txtElement == null) 
    return; 

TextPattern tp; 

try 
{ 
    tp = txtElement.GetCurrentPattern(TextPattern.Pattern) as TextPattern; 
} 
catch(Exception ex) 
{ 
    return; 
} 

TextPatternRange[] trs; 

if (tp.SupportedTextSelection == SupportedTextSelection.None) 
{ 
    return; 
      } 
else 
{ 
    trs = tp.GetSelection(); 
    string selectedText = trs[0].GetText(-1); 
    MessageBox.Show(selectedText); 

} 

Questo funziona per alcune applicazioni (come il blocco note, visivi studi di caselle di modifica e simili), ma non per tutti (come Word, Firefox, Chrome, e così via.)

Chiunque qui ha qualche idea su come essere in grado di recuperare il testo selezionato in QUALSIASI domanda?

+0

Nonostante ciò che viene detto di seguito, ricorda che gli appunti vengono riempiti solo _ se l'applicazione implementa Ctrl-C (o qualsiasi altra cosa); gli appunti non sono una soluzione – smirkingman

risposta

7

Sfortunatamente, non c'è modo di ottenere il testo selezionato da qualsiasi applicazione arbitraria. UI Automation funziona se l'applicazione supporta UIA TextPattern; sfortunatamente, la maggior parte non lo fa. Ho scritto un'applicazione che ha cercato di fare questo, e ha avuto un sacco di fallback.

ho provato (più o meno in ordine):

  1. UIA.TextPattern
  2. Internet Explorer-specifico (questo ha avuto diverse implementazioni per IE 6,7,8,9)
  3. Adobe lettore- specifica
  4. Appunti

Questo coperto 80-90% delle domande là fuori, ma c'erano un bel po 'che ancora non è riuscito.

Si noti che il ripristino degli Appunti ha problemi particolari; alcune applicazioni (Office, ecc.) inseriscono negli Appunti informazioni specifiche del fornitore che possono avere puntatori in dati interni; quando metti le tue informazioni negli Appunti, i dati interni vengono rilasciati e quando reinserisci i vecchi dati, gli appunti ora puntano a dati liberati, causando arresti anomali. Si potrebbe aggirare questo problema solo salvando/ripristinando i formati di Appunti noti, ma, di nuovo, ciò comporta un comportamento strano nel fatto che le app si comportano "in modo errato" invece di andare in crash.

+0

Come funzionava l'implementazione specifica di Adobe Reader? hai qualche dettaglio, fammi sapere. –

+0

Mi trovo di fronte a un problema in IE, vorresti suggerire una soluzione? –

+0

@ChintanPatel Questo è stato diversi anni fa, e ho perso il codice sorgente, quindi non posso aiutare. –

1

E 'possibile guardare gli appunti e fare il tasto di scelta rapida: CTRL + C?

Non sarà possibile leggere il testo selezionato da qualsiasi applicazione. Ad esempio alcuni file PDF hanno contenuti protetti che non consentono le copie. La tecnologia

1

UIA non supportata da tutte le applicazioni, si può provare a utilizzare MSAA in alcuni casi (come FF, Chrome, ecc), ma è ancora otterrete molti problemi. Il modo migliore è quello di salvare il testo degli appunti corrente, inviare il messaggio "CTRL + C" tramite SendMessage Funzione WinAPI, ottenere il testo degli appunti e ripristinare il testo degli appunti iniziale come ha detto Rick.

+1

Gli Appunti connessi devono essere salvati, quindi ripristinati. Questo non è sempre facile. –

+0

Ho provato il tuo approccio ma non sono riuscito a catturare il testo selezionato da Office Word. :( http://stackoverflow.com/questions/25281314/capture-selected-text-from-any-window-does-not-sucess-with-office-word – Kiradev