Eventos Ratón C#

Iniciado por kargarof, 2 Julio 2008, 08:55 AM

0 Miembros y 1 Visitante están viendo este tema.

kargarof

Tengo un problemilla, utilizo un OCR para sacar información de un documento de identidad escaneado.

El funcionamiento es el siguiente, selecciono la imagen por medio de un openDialog (aunque ya he conseguido que acceda a la carpeta automaticamente y la seleccione sola) y le paso el OCR (también lo hace solo), pero el problema viene aquí. Debo seleccionar la zona donde se encuentra el texto haciendo una selección con el ratón, pero claro, esto lo hago a mano y necesito que sea automatico, ya tngo las coordenadas y el grosos que debe de poseer la selección pero no se como emular el comportamiento del ratón.

Utilizo VS C#.Net Framework 1.1

Gracias a todos de antemano.

MANULOMM

hola, pues con un evento propiamente no podes mover el mouse, los eventos responden a las acciones propias de la pesonar, lo que tenes que hacer es buscar la api para mover el mouse y ya veras te miras lo de las coordenadas.


Atentamente,

Juan Manuel Lombana
Medellín - Colombia


kargarof

Ok, muchas gracias. Me miraré algunas webs a ver si encuentro algo que me sirva.

De todos modos si alguien sabe de alguna o me la puede facilitar lo agradecería.

MANULOMM

#3
Hola, te paso una info que encontre...(Porcierto deberias pasar la solucion al Framework 2.0 pues el 1.1 esta obsoleto.)

//Codigo Probado en VS 2008 (Framwork 2.0 y 3.5) y en SharpDevelop 1.1 (Framework 1.1)
            //Hacer este using.
            using System.Windows.Forms;

            int x = 10;
            int y = 50;
            this.Cursor = new Cursor(Cursor.Current.Handle);
            Cursor.Position = new Point(x, y);


Por Cierto Con la API seria Asi


//Agregas este using.
using System.Runtime.InteropServices;

public class Form1 : Form
{
               [DllImport("User32.dll")]
               public static extern bool SetCursorPos(int x, int y);

void Button1Click(object sender, System.EventArgs e)
{
                        //Este metodo mueve el cursor en X(parametro1) y en Y(parametro2)
SetCursorPos(50,50);
}
}

si no entiendes algo BUSCA EN GOOGLE... jejeje, si algo posteas....

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


kargarof

#4
Lo primero si lo tenia claro, el mayor problema viene cuando quiero desplazarlo pero simulando que no suelto el botón de un punto a otro, no se si llego a explicarme.  Con las API's me peleo bastante y no termino de pillarle el truco, si pudieras ser más claro  :P. Gracias por la ayuda.

kargarof

#5
Bueno rebuscando y rebuscando, he encontrado algo que se supone realiza lo que yo busco pero como todo en esta vida, no sale del todo bien.

Tengo lo siguiente:

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


y una función:

public void Raton()
{
      mouse_event(MOUSEEVENTF_LEFTDOWN, 425, 330, 0, 0);
      mouse_event(MOUSEEVENTF_LEFTUP, 975, 345, 0, 0);
}


Y el problema es:

Una llamada a la función PInvoke 'DocumentProcessing1!DocumentProcessing.Form1::mouse_event' impidió la correspondencia de la pila. Es posible que la razón sea que la firma PInvoke administrada no coincida con la firma de destino no administrada. Compruebe que la convención y los parámetros de llamada de la firma PInvoke coinciden con la firma no administrada de destino.

Le he dado vueltas y vueltas y nada. Si alguein supiera porque...

He conseguido que el problema desaparezca cambiando los "long" por "int", pero ahora no me funciona el mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, x, y, 0, 0);

MANULOMM

debes hacer la conversion en la invocacion a long
osea

mouse_event((long)MOUSEEVENTF_LEFTDOWN, 425, 330, 0, 0);


el error es que no coincide el envio de parametros con lo que la funcion espera (PInvoke)

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


kargarof

Bueno creo que di con la tecla:

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

public void ClickPoint(int x, int y)
{
Cursor.Position = new Point(x, y);
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_MOVE, 170, 7, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
}


Solo me queda perfilarlo y ponerlo bonito. Gracias por la info Manulomm.