2010-04-29 57 views
6

¿Cómo podría activar programáticamente un evento de clic izquierdo en el mouse?Cómo activar programáticamente un mouse, haga clic izquierdo en C#?

Gracias.

editar: el evento no se desencadena directamente en un botón. Estoy apuntando a la plataforma de Windows.

+2

¿En qué plataforma? Winforms? WPF? Silverlight? formas web (= html/javascript)? O solo "windows" (nivel bajo) –

+0

Posible duplicado de [¿Cómo simular el clic del mouse en C#?] (Http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c) – AlexanderMP

Respuesta

1

https://web.archive.org/web/20140214230712/http://www.pinvoke.net/default.aspx/user32.sendinput

uso de la API de Win32 para enviar entrada.

Actualización:

Dado que ya no trabajo con la API de Win32, no voy a actualizar esta respuesta sea correcta cuando los cambios en la plataforma o sitios web no estén disponibles. Como esta respuesta ni siquiera se ajusta a los estándares de Stackoverflow (no contiene la respuesta en sí misma, sino un enlace a un recurso externo, ahora desaparecido), no tiene sentido asignarle ningún punto o dedicarle más tiempo.

En su lugar, echar un vistazo a esta pregunta en StackOverflow, que creo que es un duplicado:

How to simulate Mouse Click in C#?

+0

Creo que eso no funciona, p. el depurador de Visual Studio pone una línea debajo de 'UINT' y debajo de 'INPUT []' Veo que no existe una clase como UINT aunque puedo cambiar eso a UInt32 Pero no sé cuál sería el cambio equivalente a INPUT [] a hazlo funcionar – barlop

+0

@barlop gracias por desenterrar esta reliquia :) y lamento que no pueda ayudarte con esto. Lo marqué como obsoleto. Busque mejores respuestas, por ej. aquí http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c – AlexanderMP

+0

Está subestimando la validez de su respuesta Andrei ha dicho que la solución mouse_event está obsoleta y su solución SendInput es más actualizado ... Y en la pregunta a la que se vinculó, la respuesta más valorada tiene la solución mouse_event ... Por lo tanto, su respuesta puede estar más actualizada que la de allí. Y solo porque un buen sitio web, pinvoke ha sido secuestrado o está redireccionando a la compañía de software de redgate, no significa que la información en la página web está obsoleta. De hecho, la página principal del sitio web de Pinvoke en este momento dice que no necesita mantenimiento. – barlop

8

Si es correcto en un botón, puede utilizar

button1.PerformClick(); 

De lo contrario, se puede extraer this MSDN article que trata de simular (y teclado) la entrada del ratón.

Además, this project puede ayudarlo también. Debajo de las cubiertas, usa SendInput.

+0

Es extraño para mí que Java tenga una mejor compatibilidad integrada que C# para hacer clic fácilmente en Windows en una ubicación arbitraria, pero la biblioteca InputSimulator es justo lo que estaba buscando. Deberías hacer que sea más prominente en tu respuesta. – rob

8

Para realizar un clic del ratón:

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
     public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); 

     private const int MOUSEEVENTF_LEFTDOWN = 0x02; 
     private const int MOUSEEVENTF_LEFTUP = 0x04; 
     private const int MOUSEEVENTF_RIGHTDOWN = 0x08; 
     private const int MOUSEEVENTF_RIGHTUP = 0x10; 

     public static void DoMouseClick() 
     { 
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 
     } 

Para mover el cursor donde quiere:

[DllImport("user32.dll")] 
     static extern bool SetCursorPos(int X, int Y); 

     public static void MoveCursorToPoint(int x, int y) 
     { 
      SetCursorPos(x, y); 
     } 
+2

Vi este, lo probé, pero la función mouse_event está obsoleta. Estoy tratando de hacer lo mismo con SendInput ahora. – Andrei

+0

Además de que mouse_event fue reemplazado por SendInput como señaló Andrei, puede pasar la posición del mouse configurando la máscara MOUSEEVENTF_ABSOLUTE en el primer argumento y pasando los coords xey en el segundo y tercer args, en lugar de llamar a SetCursorPos primero. – rob

+0

Voy a probar con este método ya que (como se comentó en la respuesta de entrada), SendInput aún no funcionó para mí. Con este método, recibí un error: "Managed Debugging Assistant 'PInvokeStackImbalance' detectó un problema en 'C: \ Use ..... \ Debug \ hprog.vshost.exe'. Información adicional: una llamada a la función PInvoke 'prog1! Prog1.FrmBlah :: mouse_event' ha desequilibrado la pila. Esto es probable porque la firma de PInvoke administrada no coincide con la firma de destino no administrada. Compruebe que la convención de llamada y los parámetros de la firma PInvoke coinciden con la firma no gestionada de destino. – barlop

-1
button1_click(null, new EventArgs()); 
Cuestiones relacionadas