2010-11-22 24 views
7

Tengo una pequeña aplicación de bandeja que registra una tecla de acceso directo en todo el sistema. Cuando el usuario selecciona un texto en cualquier lugar de cualquier aplicación y presiona esta tecla de acceso directo, quiero poder capturar el texto seleccionado. Actualmente estoy haciendo esto utilizando AutomationElements:Cómo obtener el texto seleccionado de CUALQUIER ventana (usando la Automatización de IU) - 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); 

} 

Esto funciona para algunas aplicaciones (como Bloc de notas, cajas de edición estudios visuales y tal) pero no para todos (como Word, Firefox, Chrome, y así sucesivamente.)

¿Alguien aquí con alguna idea de cómo recuperar el texto seleccionado en CUALQUIER aplicación?

+0

A pesar de lo que se dice a continuación, recuerde que el portapapeles solo se llena _si la aplicación implementa_ Ctrl-C (o lo que sea); el portapapeles no es una solución – smirkingman

Respuesta

7

Desafortunadamente, no hay forma de obtener el texto seleccionado de una aplicación arbitraria. UI Automation funciona si la aplicación es compatible con UIA TextPattern; desafortunadamente, la mayoría no. Escribí una aplicación que intentó hacer esto, y tuve un montón de inconvenientes.

Probé (más o menos en orden):

  1. UIA.TextPattern
  2. Internet Explorer-específica (esto tuvo diferentes implementaciones de IE 6,7,8,9)
  3. Adobe Lector-
  4. específica
  5. portapapeles

Esta cubrió el 80-90% de las aplicaciones por ahí, pero había muy pocos que todavía no.

Tenga en cuenta que la restauración del portapapeles tiene sus propios problemas; algunas aplicaciones (Office, etc.) ponen información específica del proveedor en el portapapeles que puede tener punteros en datos internos; cuando coloca su propia información en el portapapeles, se liberan los datos internos, y cuando vuelve a colocar los datos anteriores, el portapapeles apunta ahora a los datos liberados, lo que provoca bloqueos. Podría solucionar esto de alguna manera guardando/restaurando formatos de portapapeles conocidos, pero nuevamente, eso da como resultado un comportamiento extraño en el sentido de que las aplicaciones se comportan "mal" en lugar de fallar.

+0

¿Cómo funcionó la implementación específica de Adobe Reader? usted tiene algún detalle, hágamelo saber. –

+0

Estoy enfrentando un problema en IE, ¿podría sugerirle una solución? –

+0

@ChintanPatel Esto fue hace varios años, y he perdido el código fuente, así que no puedo ayudar. –

1

¿Es posible mirar el portapapeles y hacer su tecla de acceso directo: CTRL + C?

No podrá leer el texto seleccionado desde ninguna aplicación. Por ejemplo, algunos archivos PDF tienen contenido protegido que no permite copias. La tecnología

1

UIA no apoyado por todas las aplicaciones, se puede tratar de utilizar MSAA en algunos casos (como FF, Chrome, etc.), sino que seguirá recibiendo muchos problemas. La mejor manera es guardar el texto actual del portapapeles, enviar un mensaje de tecla "CTRL + C" a través de SendMessage Función WinAPI, obtener texto del portapapeles y restaurar el texto inicial del portapapeles como dijo Rick.

+1

El portapapeles debe ser guardado, y luego volver a colocar palabras posteriores. Esto no siempre es fácil. –

+0

Intenté su enfoque, pero no pude capturar el texto seleccionado de Office Word. :( http://stackoverflow.com/questions/25281314/capture-selected-text-from-any-window-does-not-sucess-with-office-word – Kiradev

Cuestiones relacionadas