none
Simular evento de click en otra aplicación RRS feed

  • Pregunta

  • Bueno, como el título dice, quiero provocar un click fuera de mi programa.

    Averigué que necesito usar funciones de la api, y la que mas se acerco a lo que necesitaba fue:

    [DllImport("user32.dll")] static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

    Pero, ese método genera el click en la posición donde se encuentra el cursor, yo lo que necesitaría es que genere un click en una posición determinada, sin mover el cursor.

    Un saludo.

    viernes, 25 de febrero de 2011 20:36

Respuestas

Todas las respuestas

  • Hola

    Calculo que los parámetros int dx, int dy  son las coordenadas, no estoy del todo seguro, probaste variarlas? Igual, me surge la duda, para que necesitas hacer eso, quizás, dependiendo de tu necesidad, haya otras vías para lograr lo que te propones... Saludos

    viernes, 25 de febrero de 2011 20:47
  • hola

    el tema que para hacer esto necesitas aplicar el concepto de Hook

     

    Using Hooks from C#

    Managing Low-Level Keyboard Hooks in VB .NET

    A Simple C# Global Low Level Keyboard Hook

     

    Processing Global Mouse and Keyboard Hooks in C#

    con este puede capturar y controlar acciones sobre otros procesos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 25 de febrero de 2011 20:54
  • Yo también pense que esos parámetros eran la posición, pero no :P

    Mi idea es que al apretar una tecla, se produzca un click en otra parte, es para hacer una serie de atajos. Al apretar la flecha de abajo que haga click en una posición donde previamente establecí, pero sin moverme el cursor y seguir trabajando normalmente.

    viernes, 25 de febrero de 2011 20:54
  • Ese es el problema, yo quiero que haga click en una posición de la pantalla, independientemente de que aplicación esté en ese lugar.
    viernes, 25 de febrero de 2011 20:57
  • Sigo sin comprender el objetivo que persigues... como que quieres hacer una serie de atajos? Primero, si haces un click en el escritorio (usando la flecha de dirección que mencionas), perderás el foco en tu aplicación así que no creo que  después de esto puedas seguir trabajando normalmente, disculpa pero no me queda claro tu objetivo, creo que va por la parte de la serie de atajos, quizás quieres crear un contextMenu (el menú contextual al que se accede con click derecho)? pero es solo una suposición que me hago, ya nos contaras... Saludos
    lunes, 28 de febrero de 2011 14:08
  • Lo del foco de la aplicacion lo manejo con las apis de windows, con el metodo

    [DllImport("user32.dll")]
    private static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);

    De esta forma controlo que tecla se presionó independientemente de la aplicación que esté en uso.

    Ya lo tengo casi todo hecho, lo único que me faltaría, sería este método:

    [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);

    pero especificando las coordenadas del click, y no tener que mover el cursor antes de llamar al método.

    Lo ideal sería:

    private const int MOUSEEVENTF_LEFTDOWN = 0x02;
    private const int MOUSEEVENTF_LEFTUP = 0x04;

    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 70, 70, 0, 0);

    Y no esto:

    private const int MOUSEEVENTF_LEFTDOWN = 0x02;
    private const int MOUSEEVENTF_LEFTUP = 0x04;

    Cursor.Position = new Point(70,70);
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

    Porque los parámetros "dx" y "dy", no funcionan como las coordenadas.

    Espero haberme explicado bien, desde ya muchas gracias.

    lunes, 28 de febrero de 2011 17:11
  • Hola julian...

    Entiendo lo que deseas hacer, que se genere un click del mouse en una región fuera de tu aplicación, no entiendo el motivo, por eso te comentaba que quizás podrías resolver el problema con un contextMenu, pero como ignoro el motivo o la necesidad que te lleva a intentar generar el click fuera de tu aplicación sin mover el mouse, no se que otra cosa aconsejarte... Ahora mismo lo que se me ocurre para resolver momentáneamente el problema, seria guardar la posición del mouse, hacer que se mueva a la zona deseada, generar el click y restaurarlo a su posición... Lo que no comprendo, te repito es la necesidad de hacer lo que te planteas, no lo que deseas hacer, espero haberme explicado mejor yo ;-) Saludos

    lunes, 28 de febrero de 2011 17:50
  • La idea es, tener varias aplicaciones abiertas, en mosaico para dar un ejemplo, y mientras trabajo en una, apreto la tecla "F5", y que haga click en un botón de otra aplicación, pero sin que me mueva el cursor de donde está, porque ahora lo uso como vos decis, pero aveces porque se me mueve el cursor, me olvido que ya no está en donde lo dejé, y termino haciendo cualquier cosa.

    Esto es solo por comodidad y curiosidad, porque un amigo que programa en VB lo hizo, pero no encuentro la forma de hacerlo en c#

    lunes, 28 de febrero de 2011 18:49
  • creo que voy comprendiendo :-) pero cuando te refieres a tener varias aplicaciones abiertas estamos hablando de por ejemplo: tener Nero, Windows Media Player, tu aplicación abiertas, y deseas por ejemplo que mientras estas usando tu aplicación, al presionar por ejemplo F5, pase a la siguiente canción que esta en la lista de reproducción del media player, o que presiones F4 y se detenga la reproducción?
    lunes, 28 de febrero de 2011 19:09
  • Esoo, justamente eso!!!!, pero como no tengo el codigo de fuente del programa, no puedo usar un findWindowsEx(), o algo por el estilo, por eso se me ocurrió esto, a no ser que haya otra forma más fácil, yo sigo buscando, pero todo lo que encuentro es lo de cambiar el cursor y despues generar el click :S
    lunes, 28 de febrero de 2011 19:41
  • Hola julian

    Si te fijas en este sitio: http://www.forosdelweb.com/f69/visual-basic-2005-salvar-archivos-desde-visual-basic-616565/    me parece que te puede servir, vas a entender como hacia tu amigo en vb para lograr su objetivo y veras las dll y mensajes que puedes usar, sinceramente nunca me enfrente a una situación por el estilo así que por el momento me es imposible dejarte un ejemplo hecho y probado por mi, pero creo que al menos de esa dirección puedes sacar algo :-) 

    Por acá te dejo otros: http://www.compartir-tecnologias.es/respuesta/comunicarse-con-ventana-aplicacion-externa-ayuda-207025602.html   

    http://www.elguille.info/NET/API/SendMessage.aspx      

    Espero te sean útiles. Saludos

    *** El problema es que por ahí, no conoces el código de los programas con los que quieres interactuar, por eso lo veo difícil, pero interesante lo que propones....

    Eso si, te aconsejo, que abras otro post y te expliques de mejor manera, estoy seguro que acá habrá quien te pueda ayudar (cuenta tu problema, lo que deseas lograr, y valora las sugerencias que te darán, así vas a encontrar la respuesta... ) Lamento no haber podido ser de mas utilidad. Suerte

    lunes, 28 de febrero de 2011 19:53