2010-03-12 7 views
19

Wie kann ich die Maus Cursor-Position in einem X-Fenster mit einem C-Programm unter Linux? Dank :) (wie SetCursorPos() in WIN)Wie setze ich die Mauszeigerposition in C auf Linux?

EDIT: Ich habe diesen Code versucht, aber nicht funktioniert:

#include <curses.h> 

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

Ihre Cursor-Position ... in was? Ein X-Fenster? Ein Terminalfenster? vi? –

+0

in einem X Fenster .. aber ich muss nicht die Cursorposition bekommen, ich muss es überall im Bildschirm setzen – frx08

+0

(Ich habe deine Frage für dich bearbeitet; du wolltest das wirklich tun, als du auf meine Antwort geantwortet hast Kommentar.) Sie sehen den Wert, spezifisch zu sein. :-) Sie haben jetzt drei Antworten, die völlig unabhängig von der Frage sind (es geht nur darum, die Cursorposition in Terminalfenstern zu setzen). –

Antwort

31

12,4 - Moving the Pointer

Obwohl Bewegung des Zeigers normalerweise sollte zum des Endbenutzers Steuer gelassen werden, manchmal ist es notwendig, den Zeiger auf eine neue Position zu bewegen, unter Programmkontrolle.

Um den Zeiger auf einen beliebigen Punkt in einem Fenster zu verschieben, verwenden Sie XWarpPointer().


Beispiel:

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

danke, aber es funktioniert nicht: Ich habe das 2. Argument von XWarpPointer von NULL auf None geändert, ich bekomme keine Fehler beim Kompilieren, aber der Cursor bewegt sich nicht – frx08

+0

Es kompilierte auch nicht für mich und ich denke es ist wegen fehlender Bibliotheken. Ich habe versucht, die von @Achernar erwähnten Bibliotheken einzubeziehen, aber mein Compiler kann die Verweise auf XOpenDisplay und die anderen Bibliotheksaufrufe immer noch nicht finden. Ich schließe sie wie folgt (natürlich nicht alle in einer Linie, aber ich habe Probleme bei der Formatierung meines Kommentars): '# include #include #include #include ' Irgendwelche Ideen, was hier falsch ist? – Seanny123

+0

Stellt sich heraus, müssen Sie sicherstellen, die X-Bibliothek während des Kompilierens zu verknüpfen. 'gcc text.cpp -lX11 -o t' – Seanny123

1

Alle modernen Terminals ANSI escape sequences unterstützen sollte. Für etwas komplizierteres (und tragbareres) sollten Sie jedoch eine Bibliothek wie verwenden.

3

können Sie XWarpPointer verwenden Sie den Mauszeiger in einem X-Fenster zu bewegen.

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

Sie wollen einen X11 program schreiben, die den Anruf XWarpPointer Funktion verwendet den Punkt zu einer relativen oder globale Position zu bewegen. (Xlib Programming Manual, Vol 1)

Im Allgemeinen ist die Verwendung von Xlib zur Programmierung des X Window Systems die grundlegendste und recht einfache Schnittstelle für die grafische Programmierung auf einem Unix- oder Linux-System. Die meisten Anwendungen, die heutzutage entwickelt werden, verwenden eine Bibliothek höherer Ebene, wie zum Beispiel GTK oder Qt zum Entwickeln ihrer GUI-Anwendungen.

Curses oder NCurses (New Curses) ist für die Programmierung Terminal-orientierte Schnittstellen, sind also in diesem Fall nicht nützlich.

11

Das ist alt, aber für den Fall, dass jemand anderes auf dieses Problem stößt. Die Antwort von tusbar war korrekt, aber der Befehl XFlush (dpy) muss am Ende hinzugefügt werden, um die Position des Cursors zu aktualisieren. Die benötigten Bibliotheken sind: 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, richtig! Danke :) Ich werde meine Antwort aktualisieren. –

3

Verwenden Jordan Sissel ausgezeichnete Dienstprogramm xdotool.

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

es XWarpPointer Wrapper-Funktion wie xdo_mousemove liefern(), hier einige Beispiel:

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 –

Verwandte Themen