source open net ironocr iron examples example c# windows winapi hook ocr

c# - open - Cómo obtener la palabra bajo el cursor en Windows?



ocr.net open source (6)

En las versiones recientes de Windows, la forma recomendada de recopilar información de una aplicación a otra (si no posee la aplicación específica por supuesto) es utilizar la tecnología de automatización de la interfaz de usuario . Wikipedia es bastante buena para obtener más información sobre esto: Automatización de la interfaz de usuario de Microsoft

Básicamente, la automatización de UI utilizará todos los medios necesarios para reunir lo que se puede reunir

Aquí hay un pequeño código de aplicación de consola que espía la interfaz de usuario de otras aplicaciones. Ejecútelo y mueva el mouse a diferentes aplicaciones. Cada aplicación tiene un soporte diferente para varios "patrones de automatización de UI". Por ejemplo, está el patrón de valor y el patrón de texto como se muestra aquí.

static void Main(string[] args) { do { System.Drawing.Point mouse = System.Windows.Forms.Cursor.Position; // use Windows forms mouse code instead of WPF AutomationElement element = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y)); if (element == null) { // no element under mouse return; } Console.WriteLine("Element at position " + mouse + " is ''" + element.Current.Name + "''"); object pattern; // the "Value" pattern is supported by many application (including IE & FF) if (element.TryGetCurrentPattern(ValuePattern.Pattern, out pattern)) { ValuePattern valuePattern = (ValuePattern)pattern; Console.WriteLine(" Value=" + valuePattern.Current.Value); } // the "Text" pattern is supported by some applications (including Notepad)and returns the current selection for example if (element.TryGetCurrentPattern(TextPattern.Pattern, out pattern)) { TextPattern textPattern = (TextPattern)pattern; foreach(TextPatternRange range in textPattern.GetSelection()) { Console.WriteLine(" SelectionRange=" + range.GetText(-1)); } } Thread.Sleep(1000); Console.WriteLine(); Console.WriteLine(); } while (true); }

La automatización de la interfaz de usuario es realmente compatible con Internet Explorer y Firefox, pero no con Chrome, que yo sepa. Ver este enlace: ¿ Cuándo se podrá acceder a Google Chrome?

Ahora, este es solo el comienzo del trabajo para ti :-), porque:

  • La mayoría de las veces, todo esto tiene una gran implicación de seguridad. El uso de esta tecnología (o tecnología directa de Windows como WindowFromPoint) requerirá derechos suficientes para hacerlo (como ser un administrador). Y no creo que DExperience tenga alguna manera de superar estas limitaciones, a menos que instalen un controlador kernel en la computadora.

  • Algunas aplicaciones no exponen nada a nadie, incluso con los derechos adecuados. Por ejemplo, si estoy escribiendo una aplicación bancaria, no quiero que espíe lo que mi aplicación mostrará :-). Otras aplicaciones como Outlook con DRM no expondrán nada por las mismas razones.

  • Solo el soporte de patrón de texto de automatización de UI puede proporcionar más información (como la palabra) que solo todo el texto. Por desgracia, este patrón específico no es compatible con IE o FF, incluso si admiten la automatización de la interfaz de usuario a nivel mundial.

Entonces, si todo esto no funciona para usted, tendrá que sumergirse más profundo y usar técnicas de reconocimiento de forma o OCR. Incluso con esto, habrá algunos casos en los que no podrá hacerlo (debido a los derechos de seguridad).

Quiero crear una aplicación que obtenga la palabra debajo del cursor (no solo para los campos de texto), pero no puedo encontrar cómo hacerlo. Usar OCR es bastante difícil. Lo único que he visto trabajando son los componentes Deskperience. Soportan una forma "nativa", pero yo les costó mucho. Ahora estoy tratando de descubrir cuál es esta forma ''nativa'' (tal vez de alguna manera de enganchar). Cualquier ayuda será apreciada.

EDITAR: Encontré una manera, pero solo obtiene el texto completo del control. ¿Alguna idea de cómo obtener solo la palabra debajo del cursor del texto completo?


Esto no es trivial si la aplicación que desea "espiar" está dibujando el texto ellos mismos. Una posible solución es activar la otra aplicación para pintar una parte de su ventana al invalidar el área directamente debajo del cursor.

Cuando la otra aplicación pinta, tendrá que interceptar las llamadas de dibujo de texto. Una forma de hacerlo es inyectar código en la otra aplicación e interceptar llamadas en funciones GDI que dibujan texto. Cuando depura las aplicaciones nativas, esto es lo que hace Visual Studio para implementar puntos de interrupción. Para probar la idea, podría usar una biblioteca como detours (pero eso no es gratis para uso comercial).

También podría verificar si la aplicación admite una de las API de accesibilidad que están en Windows para facilitar cosas como lectores de pantalla para personas ciegas.

Una palabra de advertencia: no he hecho nada de esto yo mismo.


Hay un SDK para obtener el texto usando OCR. No es gratis, pero es bastante barato en comparación con otros productos: http://www.screenocr.com/screen-ocr-library-sdk.htm Tienen una aplicación que ofrece las mismas características para que pueda probar la demostración también.


Me haría eco de lo que dijo Patricker, pero creo que no hay una manera confiable de hacer lo que quieras.

Probablemente haya obtenido el texto de la ventana o algo así. Pero, ¿qué pasa si el cursor está sobre una ventana que no usa el texto de la ventana para almacenar su contenido? Windows no tiene obligación de almacenar sus datos de una manera particular.

Esto termina apuntándote hacia el reconocimiento de caracteres donde miras los píxeles debajo del cursor y tratas de averiguar qué palabras hay. Pero no solo esto no es trivial, sino que tampoco es infalible. ¿Qué pasa si parte de la palabra no es visible porque se extiende fuera de la ventana?

Esto definitivamente no es trivial. Hay un par de maneras de abordarlo. Pero no hay una manera confiable que funcione con todas las ventanas.


Para lograr esto, necesitas un enfoque multifacético.

UIA funciona en muchas aplicaciones pero necesita experimentar para ver dónde se devuelve el texto. Puede estar en Elemento, Valor o Rango. No hay consistencia incluso en todas las aplicaciones de oficina.

Si falla la UIA, enumere la tabla de objetos en ejecución (ROT) y vuelva a conectar los punteros COM a varias aplicaciones registradas en el ROT. A continuación, puede convertir estos punteros a los tipos de oficina subyacentes:
por ejemplo:

enumerate ROT - then wb = (Excel._Workbook)enumerator.Value; string strText = wb.Application.ActiveCell.Text.ToString();

Si los dos métodos anteriores fallan, haga uso del sistema de OCR libre en MODI (biblioteca de tipos de Microsoft Office Document Imaging 12.0)


Si la aplicación necesita manejar no solo aplicaciones .Net, comenzaría con la importación de funciones ( P/Invoke ):

Más tarde, puede recorrer los controles e intentar obtener el texto desde adentro en función del tipo. Si encuentro algo de tiempo, intentaré publicar dicho código.

Después de algunas comprobaciones, parece que la mejor manera (desafortunadamente también la difícil) es engancharse en el texto GDI, representando algo de discusión