2010-06-09 16 views
5

como puedo poner en uso SendMessage o PostMessage que pulsar un botón en otra aplicaciónHaga clic en un botón en otra aplicación

Tengo un código de ejemplo para hacer esto consiguiendo identificador de ventana, pero no trabajar

también utilicé "WinDowse" para obtener la información requerida. aquí está el código

private const uint BM_CLICK = 0x00F5; 
private const uint WM_LBUTTONDOWN = 0x0201; 
private const uint WM_LBUTTONUP = 0x0202; 

private void PushOKButton(IntPtr ptrWindow) 
{ 
    WindowHandle = FindWindow(null, "Form1"); 
    if (ptrWindow == IntPtr.Zero) 
     return; 

    IntPtr ptrOKButton = FindWindowEx(ptrWindow, IntPtr.Zero, "Button", "&Yes"); 

    if (ptrOKButton == IntPtr.Zero) 
     return; 

    SendMessage(ptrOKButton, WM_LBUTTONDOWN, 0, 0); 
    SendMessage(ptrOKButton, WM_LBUTTONUP, 0, 0); 
    SendMessage(ptrOKButton, BM_CLICK, 0, 0); 
} 

¿Existe una competencia Suloution en C#?

Respuesta

0

Tiene la idea general adecuada. Siempre hay trucos para la automatización.

El botón Abajo/Abajo está muy cerca de la acción cruda de hacer clic, pero no es lo mismo. Usted tendrá que considerar

  1. las coordenadas donde se hace clic - algunos botones no les gusta clics borde en 0,0
  2. posición del ratón - ratón fuera del botón al principio o al final puede hacer que se a no funcionar
  3. tiempo para hacer clic - a veces un simple clic se ignora, añadir un pequeño retraso de, digamos, 10 ms

BM_Click es un mensaje de Win32 adicional que se envía cuando se hace un clic del ratón sobre un botón - es la método más corto y más fácil si los controles son del tipo correcto para usar thi s solo

Se realizan algunos esfuerzos para evitar cosas como el uso de WM_GetText en las ediciones de contraseñas de aplicaciones extranjeras, tenga cuidado de que también tenga problemas dependiendo de la aplicación de destino.

Lamentablemente no tengo código de muestra C# para usted en este momento.

Quizás podría consultar AutoIT para ahorrar algo de tiempo.

+0

* "Tiene la idea general correcta." * - Bueno, no. La idea es tan equivocada como se pone. Los mensajes son solo la parte observable del procesamiento de entrada. Si reproduces solo esa parte, terminarás con un estado incoherente. La verdadera respuesta es [UI Automation] (https://msdn.microsoft.com/en-us/library/ms747327.aspx). – IInspectable

+0

El marco de trabajo .NET UI Automation es limitado y causa una variedad de artefactos, como el hecho de que Adobe Reader solicite el modo de accesibilidad si incluso mira hacia los lados las ventanas que muestra. Hemos estado bloqueando muchas aplicaciones de Microsoft que intentan usar la Automatización de la interfaz de usuario debido a errores en las aplicaciones de destino donde la creación de control personalizado no ha cubierto adecuadamente el soporte de automatización. –

+0

La IU Automatización se expone a través de objetos COM, que son fáciles de consumir desde .NET, en caso de que el soporte de biblioteca preconstruido no sea suficiente. Su comentario indica que respondió una pregunta diferente: * "Suponiendo que la automatización de la interfaz de usuario no funciona para nosotros, ¿cuáles son las alternativas?" * El OP nunca afirmó que la automatización de la interfaz de usuario no funcionaría para ellos, por lo que debe considerarse primero . Y si necesita falsificar información, realmente necesita hacerlo bien. Enviar mensajes no funcionará (consulte [Repetir entrada no es lo mismo que reprocesarlo] (https://blogs.msdn.microsoft.com/oldnewthing/20121206-00/?p=5903)). – IInspectable

-1

Aquí hay un ejemplo del uso de la API win32 para manejar el mouse, en realidad se usa para arrastrar y soltar la selección de un área, pero puede cambiar las coordenadas al mouse hacia abajo/arriba dentro del botón.

POINT p; 
BOOL cursorPosGetSuccessful = GetCursorPos(&p); 
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, horA, verA, NULL, 0); 
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, NULL, 0); 
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, horB, verB, NULL, 0); 
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, NULL, 0); 
if (cursorPosGetSuccessful)// put the mouse back to roughly where it used to be before the scan. 
    mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, p.x, p.y, NULL, 0); 
+0

supongo que tengo estos: coords de mouse, título de ventana, identificador de ventana, nombre de clase de ventana, ¿puede dejar un código completo? – sam

+0

Directamente desde [mouse_event] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646260.aspx): * "Esta función ha sido reemplazada. Use [SendInput] (https: // msdn .microsoft.com/es-us/library/windows/desktop/ms646310.aspx) en su lugar. "* Ninguno de los dos permite controlar un proceso específico; la entrada siempre va al proceso en primer plano. Como se indicó en su otra respuesta (¿por qué sintió la necesidad imperiosa de publicar dos de todos modos?): La verdadera respuesta es [Automatización de UI] (https://msdn.microsoft.com/en-us/library/ms747327.aspx) . – IInspectable

+0

Gracias por la actualización. La segunda publicación se debió a diferentes respuestas posibles. –

Cuestiones relacionadas