usando tag personalizados herencia controles c# winapi automation tooltip

tag - herencia windows forms c#



Obtener el texto de la informaciĆ³n sobre herramientas del control heredado de Win32 mediante programaciĆ³n (2)

Lo mejor que podemos hacer desde la perspectiva de la automatización de la interfaz de usuario es suscribirnos al evento abierto con información sobre herramientas y al proceso de gestión de eventos. Este enlace tiene una muestra http://msdn.microsoft.com/en-us/library/ms752286.aspx . La lista de eventos de automatización de UI se puede encontrar aquí http://msdn.microsoft.com/en-us/library/ms748252.aspx . Los detalles sobre AutomationElement.ToolTipOpenedEvent se pueden encontrar aquí http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.tooltipopenedevent.aspx .

Con la automatización de la interfaz de usuario, al menos deberíamos dejar que las cosas sucedan, ya sea presionando un botón o abriendo una ventana o mostrando una información sobre herramientas. Así que suscribirse a los eventos ToolTip haría el trabajo aquí con un mejor rendimiento que los retrasos duros de Sleep (). De lo contrario, la forma hacky (aunque no de extremo a extremo), como lo mencionan algunos, es obtener por adelantado los identificadores de cadena de recursos para la cadena de información sobre herramientas y verificar las cadenas de recursos durante la ejecución de las pruebas automatizadas.

Me gustaría obtener el texto de información sobre herramientas para el control heredado de win32 (no los controles WPF que son compatibles inherentemente con la automatización de la interfaz de usuario ).

Que he hecho:

  • Dado un botón de interés, tengo su AutomationElement , y su rectificador
  • Moví el mouse sobre este botón (en el código);
  • Thread.Sleep(1500) para esperar a que aparezca el control de información sobre herramientas;
  • Enumerar todas las ventanas secundarias de escritorio y obtener la ventana secundaria tooltipAutomationElement , cuyo tipo es "Tooltip" ;
  • Desde tooltipAutomationElement , obtenga la propiedad del nombre de esta información sobre herramientas, que corresponde a la cadena de información sobre herramientas.

Esto realmente funciona, pero la penalización es: tengo que sleep(1500) y esperar manualmente a que aparezca la información sobre herramientas (se escanean 5-20 botones para las cadenas de información sobre herramientas), que no coincide con el requisito de rendimiento.

Lo que se espera (no estoy seguro de si es factible)

  • Obtenga programáticamente la cadena de información sobre herramientas del botón sin que sea necesario que aparezca la información sobre herramientas
  • Sin tener que colocar el mouse sobre cada botón uno por uno.

Actualización 1 : para TTN_NEEDTEXT , el documento de MSDN no parece muy claro, y no tengo idea de cómo programar esto usando C #. Uno de los enlaces relevantes para estructuras / mensajes de bajo nivel relacionados con el control de información sobre herramientas se puede encontrar here .

Actualización 2 : Aquellos que creen que esto podría hacerse por ..., diría, es más fácil decirlo que hacerlo. Doy la bienvenida a quienes lo han intentado, a comentar sobre esto, y algunas soluciones ostensiblemente viables son bienvenidas si puede ofrecer alguna evidencia para demostrar su aplicabilidad y eficacia.

Actualización 3 : si tratamos de minimizar el TTM_SETDELAYTIME para que N in the sleep(N) pueda ser minimizado, esto no funciona después de un poco de experimentación. Solo podemos ajustar esto una vez que exista el identificador de la ventana de información sobre herramientas. p.ej

SendMessage(_tooltipCtrl.Handle, TTM_SETDELAYTIME, _TTDT_INITIAL, 10); //10 ms

Actualización 4 : el uso del mensaje TTM_GETTEXTA parece ser una solución, sin embargo, es similar a la Actualización 3, donde necesitamos el manejo de tooltipCtrl , que solo está disponible DESPUÉS de que se cree la información sobre herramientas, ya que para tener esta información sobre herramientas creada, no tenemos opción, pero al pasar el cursor del mouse sobre la herramienta, que parece tener problemas de rendimiento ( Thread.Sleep ) como se describe anteriormente.

SendMessage(_tooltipCtrl.Handle, TTM_GETTEXTA, 0, ti);

Actualización 5 : "Cómo obtener el texto de información sobre herramientas" usando InterOp (PInvoke) o IU de automatización usando el enfoque tradicional (mover el mouse sobre la ventana de la herramienta, encontrar el manejador Hwnd, luego obtener su texto ...) no es asunto de esta publicación . Qué se espera: ¿Podemos extraer la cadena de información sobre herramientas de un control (por ejemplo, un botón) sin necesidad de pasar el control ? Si es así, ¿cómo?

Actualización 6 : el uso de WM_MOUSEHOVER para activar la ventana de información sobre herramientas parece no funcionar, lo he probado usando SendMessage (...) con el wparam correcto y lparam lleno, pero en vena.


Solo un pensamiento, pero trate de usar mensajes en lugar de aprovechar el mouse real.

Juega con WM_HOVER, WM_MOUSEHOVER, WM_MOUSEENTER

SendMessage(_buttonCtrl.Handle, WM_MOUSEHOVER, ..., ...)

etc.

La captura de pantalla se ve como un control personalizado, por lo que se tratará de piratear para averiguar qué desencadena la información sobre herramientas.

Potencialmente, puede enviar varios WM_MOUSEENTER o WM_MOUSEHOVER simultáneamente. Realmente depende del código subyacente.

Si esto está causando un retraso demasiado prolongado (y ninguna de las soluciones sugeridas funciona) piense en extraer la prueba de información sobre herramientas en un grupo de prueba secundario que se ejecuta con menos frecuencia o solo en una solicitud específica.

Además ... y estoy seguro de que ya lo has intentado ... pero si no, revisa UI Spy y ve si informa cualquier información sobre la información sobre herramientas antes de que realmente se genere.