2010-03-12 39 views
19

¿cómo puedo configurar el mouse posición del cursor en una ventana X usando un programa C en Linux? gracias :) (como SetCursorPos() en WIN)¿Cómo establecer la posición del cursor del mouse en C en Linux?

EDITAR:

He probado este código, pero no funciona:

#include <curses.h> 

main(){ 
move(100, 100); 
refresh(); 
} 
+2

Su posición del cursor ... ¿en qué? Una ventana X? Una ventana de terminal? vi? –

+0

en una ventana X .. pero no tengo que obtener la posición del cursor, tengo que configurarlo en todas partes en la pantalla – frx08

+0

(he editado su pregunta para usted; realmente quería hacer eso cuando respondiera a mi comenta). Ves el valor de ser específico. :-) Ahora tiene tres respuestas completamente independientes de la pregunta (se trata de establecer la posición del cursor en las ventanas de la terminal). –

Respuesta

31

12,4 - Moving the Pointer

Aunque el movimiento del puntero normalmente debe dejarse al control del usuario final, a veces es necesario mover el puntero a una nueva posición bajo control del programa.

Para mover el puntero a un punto arbitrario en una ventana, use XWarpPointer().


Ejemplo:

Display *dpy; 
Window root_window; 

dpy = XOpenDisplay(0); 
root_window = XRootWindow(dpy, 0); 
XSelectInput(dpy, root_window, KeyReleaseMask); 
XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, 100, 100); 
XFlush(dpy); // Flushes the output buffer, therefore updates the cursor's position. Thanks to Achernar. 
+0

gracias pero no funciona: edité el segundo argumento de XWarpPointer de NULL a None, no recibo errores durante la compilación, pero el cursor no se mueve – frx08

+0

Tampoco compiló para mí y creo que es porque faltan bibliotecas. Intenté incluir las bibliotecas mencionadas por @Achernar, pero mi compilador todavía no puede encontrar las referencias a XOpenDisplay y las otras llamadas a la biblioteca. las estoy incluyendo la siguiente manera (obviamente, no todos en una sola línea, pero estoy teniendo problemas al dar formato a mi comentario): '# include # include # include # include ' ¿Alguna idea de lo que está mal aquí? – Seanny123

+0

Resulta que debe asegurarse de vincular la biblioteca X durante la compilación. 'gcc text.cpp -lX11 -o t' – Seanny123

1

Todos los terminales modernos deben apoyar ANSI escape sequences. Para cualquier cosa más complicada (y más portátil), sin embargo, debe considerar el uso de una biblioteca como ncurses.

3

Puede utilizar XWarpPointer para mover el cursor del ratón en una ventana de X.

XWarpPointer(display, src_w, dest_w, src_x, src_y, src_width, src_height, dest_x, 
       dest_y) 
     Display *display; 
     Window src_w, dest_w; 
     int src_x, src_y; 
     unsigned int src_width, src_height; 
     int dest_x, dest_y; 
4

desea escribir un X11 program que utiliza la función de llamada XWarpPointer para mover el punto a una posición relativa o global. (Manual de programación Xlib, Vol.1)

En general, usar Xlib para programar el sistema X Window es la interfaz más básica y de bajo nivel para la programación gráfica en un sistema Unix o Linux. La mayoría de las aplicaciones desarrolladas hoy en día usan una biblioteca de nivel superior como GTK o Qt para desarrollar sus aplicaciones GUI.

Curses o NCurses (New Curses) es para la programación de interfaces orientadas a terminales, por lo que no son útiles en este caso.

11

Esto es antiguo, pero en caso de que alguien más se encuentre con este problema. La respuesta proporcionada por tusbar fue correcta pero se debe agregar el comando XFlush (dpy) al final para actualizar la posición del cursor. Las bibliotecas necesarias son: X11/X.h, X11/Xlib.h, X11/Xutil.h.

int main(int argc, char *argv[]){ 
     //Get system window 
     Display *dpy; 
     Window root_window; 

     dpy = XOpenDisplay(0); 
     root_window = XRootWindow(dpy, 0); 
     XSelectInput(dpy, root_window, KeyReleaseMask); 

     XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, 100, 100); 

     XFlush(dpy); 

     return 0;} 
+0

¡Oh, claro! Gracias :) Actualizaré mi respuesta. –

3

use la excelente utilidad xdotool de Jordan Sissel.

http://www.semicomplete.com/projects/xdotool/

que proporcionan función de contenedor XWarpPointer como xdo_mousemove(), es aquí algunos ejemplos:

Display *display = NULL; 
xdo_t *xdo = NULL; 

void mouse_left_down(int x, int y) 
{ 
    xdo_mousemove(xdo, x, y, 0) 
    xdo_mousedown(xdo, CURRENTWINDOW, Button1); 
} 

void mouse_left_up(int x, int y) 
{ 
    xdo_mouseup(xdo, CURRENTWINDOW, Button1, 1, 0); 
} 

void mouse_left_double_click(int x, int y) 
{ 
    xdo_mousemove(xdo, x, y, 0); 
    xdo_click_multiple(xdo, CURRENTWINDOW, Button1, 1, 0); 
    doubleclick = TRUE; 
} 

int main() 
{ 

    display = XOpenDisplay(NULL); 
    if(display == NULL) 
    { 
    fprintf(stderr, "can't open display!\n"); 
    return -1; 
    } 
    xdo = xdo_new((char*) display); 

    //some task here 
    // ... 

    return 0; 
} 
+0

xdo_mousemove() -> xdo_move_mouse() https://github.com/jordansissel/xdotool/blob/master/xdo.h#L238 –

Cuestiones relacionadas