2010-11-22 48 views
7

J'ai une petite application de plateau qui enregistre une touche de raccourci pour l'ensemble du système. Lorsque l'utilisateur sélectionne un texte n'importe où dans une application et appuie sur cette touche de raccourci, je veux être en mesure de capturer le texte sélectionné. Je fais actuellement cela en utilisant AutomationElements:Comment obtenir le texte sélectionné de N'IMPORTE QUELLE fenêtre (en utilisant UI Automation) - 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); 

} 

Cela fonctionne pour certaines applications (comme le bloc-notes, les boîtes d'édition studios visuels et autres), mais pas pour tous (tels que Word, FireFox, Chrome, et ainsi de suite.

Quelqu'un ici avec des idées de comment être capable de récupérer le texte sélectionné dans n'importe quelle application?

+0

En dépit de ce qui est dit ci-dessous, rappelez-vous que le presse-papiers n'est rempli que si l'application implémente_Ctrl-C (ou autre); le presse-papiers n'est pas une solution – smirkingman

Répondre

7

Malheureusement, il n'y a aucun moyen d'obtenir le texte sélectionné à partir d'une application quelconque. UI Automation fonctionne si l'application prend en charge UIA TextPattern; Malheureusement, la plupart ne le font pas. J'ai écrit une application qui a essayé de le faire, et a eu un tas de solutions de repli.

J'ai essayé (à peu près dans l'ordre):

  1. UIA.TextPattern
  2. Internet Explorer spécifique (cela avait différentes implémentations pour IE 6,7,8,9)
  3. Adobe Reader- spécifique
  4. Presse-papiers

Ce couvert 80-90% des applications là-bas, mais il y en avait pas mal qui reste a échoué.

Notez que la restauration du presse-papiers a ses propres problèmes; certaines applications (Office, etc.) placent dans le presse-papiers des informations spécifiques au fournisseur pouvant contenir des pointeurs sur des données internes; Lorsque vous placez vos propres informations dans le Presse-papiers, les données internes sont libérées et lorsque vous replacez les anciennes données, le Presse-papiers pointe vers des données libérées, ce qui provoque des plantages. Vous pouvez contourner ce problème en ne sauvegardant/en restaurant que les formats de presse-papiers connus, mais encore une fois, cela se traduit par un comportement étrange dans les applications qui se comportent "mal" au lieu de se bloquer.

+0

Comment l'implémentation spécifique à Adobe Reader a-t-elle fonctionné? vous avez des détails, faites le moi savoir. –

+0

Je suis confronté à un problème dans IE, auriez-vous s'il vous plaît suggérer une solution pour cela? –

+0

@ChintanPatel C'était il y a plusieurs années, et j'ai perdu le code source, donc je ne peux pas aider. –

1

Est-il possible de regarder le presse-papier et de créer votre raccourci clavier: CTRL + C?

Vous ne pourrez lire le texte sélectionné dans aucune application. Par exemple, certains fichiers PDF ont un contenu protégé qui interdit les copies.

1

technologie UIA n'a pas pris en charge par toutes les applications, vous pouvez essayer d'utiliser MSAA dans certains cas (comme FF, Chrome, etc.), mais vous aurez toujours de nombreux problèmes. Le meilleur moyen est de sauvegarder le texte du presse-papier actuel, envoyer un message de touche "CTRL + C" via SendMessage Fonction WinAPI, obtenir le texte du presse-papier, et restaurer le texte du presse-papiers initial comme Rick dit.

+1

Le presse-papiers doit être sauvegardé, puis remis en mémoire. Ce n'est pas toujours facile. –

+0

J'ai essayé votre approche, mais j'ai échoué à capturer le texte sélectionné à partir d'Office Word. :( http://stackoverflow.com/questions/25281314/capture-selected-text-from-any-window-does-not-sucess-with-office-word – Kiradev