Wie setze ich die Mauszeigerposition in C unter Linux?

Lesezeit: 4 Minuten

Benutzer-Avatar
frx08

wie kann ich das einstellen Maus Cursorposition in einem X-Fenster mit einem C-Programm unter Linux? danke 🙂 (wie setcursorpos() in WIN)

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

#include <curses.h>

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

  • Ihre Cursorposition … in was? Ein X-Fenster? Ein Terminalfenster? vi?

    – TJ Crowder

    12. März 2010 um 14:47 Uhr

  • in einem X-Fenster … aber ich muss nicht die Cursorposition bekommen, ich muss sie überall auf dem Bildschirm einstellen

    – frx08

    12. März 2010 um 14:48 Uhr


  • (Ich habe Ihre Frage für Sie bearbeitet; Sie wollten das wirklich tun, als Sie auf meinen Kommentar geantwortet haben.) Sie sehen, wie wichtig es ist, spezifisch zu sein. 🙂 Sie haben jetzt drei Antworten, die nichts mit der Frage zu tun haben (sie beziehen sich alle auf das Festlegen der Cursorposition in Terminalfenstern).

    – TJ Crowder

    12. März 2010 um 14:57 Uhr


  • danke, aber ich wusste nicht, ob ich mich erkläre, ich muss die Maus programmgesteuert bewegen

    – frx08

    12. März 2010 um 15:07 Uhr

  • Im X Window System die Maus Mauszeiger bezieht sich auf das grafische Symbol, während Sie das verschieben möchten Zeiger selbst (was den “Hotspot” sowie auch das Cursor-Symbol verschiebt).

    – mctylr

    12. März 2010 um 15:28 Uhr

Benutzer-Avatar
Bertrand Maron

12.4 – Bewegen des Zeigers

Obwohl Bewegung des Zeigers normal sollte der Kontrolle des Endbenutzers überlassen bleiben, manchmal ist es notwendig, den Zeiger programmgesteuert an eine neue Position zu bewegen.

Um den Mauszeiger an einen beliebigen Punkt in einem Fenster zu bewegen, 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.

  • 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

    12. März 2010 um 16:14 Uhr

  • Es hat auch nicht für mich kompiliert und ich denke, es liegt an fehlenden Bibliotheken. Ich habe versucht, die von @Achernar erwähnten Bibliotheken einzuschließen, aber mein Compiler kann die Verweise auf XOpenDisplay und die anderen Bibliotheksaufrufe immer noch nicht finden. Ich füge sie wie folgt ein (offensichtlich nicht alle in einer Zeile, aber ich habe Probleme, meinen Kommentar zu formatieren): #include <stdio.h> #include <X11/X.h> #include <X11/Xlib.h> #include <X11/Xutil.h> Irgendwelche Ideen, was hier falsch ist?

    – Seanny123

    22. Juli 2013 um 2:49 Uhr


  • Es stellt sich heraus, dass Sie beim Kompilieren darauf achten müssen, die X-Bibliothek zu verknüpfen. gcc text.cpp -lX11 -o t

    – Seanny123

    22. Juli 2013 um 3:31 Uhr

Benutzer-Avatar
Achernar

Dies ist alt, aber falls jemand anderes auf dieses Problem stößt. Die Antwort von tusbar war richtig, aber der Befehl XFlush(dpy) muss am Ende hinzugefügt werden, um die Position des Cursors zu aktualisieren. Die benötigten Bibliotheken sind: X11/Xh, 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;}

PS: Sie können diesen Befehl verwenden, um den Code zu erstellen gcc main.c -lX11

Du willst a schreiben X11-Programm das nutzt den Aufruf XWarpPointer Funktion, um den Punkt an eine relative oder globale Position zu verschieben. (Xlib-Programmierhandbuch, Band 1)

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

Curses oder NCurses (New Curses) dienen der Programmierung terminalorientierter Schnittstellen, sind also in diesem Fall nicht sinnvoll.

Verwenden Sie Jordan Sissels ausgezeichnetes Dienstprogramm xdotool.

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

es bietet eine XWarpPointer-Wrapper-Funktion wie xdo_mousemove(), hier ein 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;
}

Sie können verwenden XWarpPointer um 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;

Benutzer-Avatar
aib

Alle modernen Endgeräte sollten dies unterstützen ANSI-Escape-Sequenzen. Für etwas Komplizierteres (und Tragbareres) sollten Sie jedoch die Verwendung einer Bibliothek wie z ncurses.

1311400cookie-checkWie setze ich die Mauszeigerposition in C unter Linux?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy