web-dev-qa-db-ja.com

LinuxのCでマウスカーソルの位置を設定するにはどうすればよいですか?

linuxでCプログラムを使用してXウィンドウでmouseカーソル位置を設定するにはどうすればよいですか?ありがとう:)(WINのsetcursorpos()のように)

編集:私はこのコードを試しましたが、機能しません:

#include <curses.h>

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

12.4 -- ポインタの移動

通常、ポインタの移動はエンドユーザーの制御に任せるべきですが、プログラムの制御下でポインタを新しい位置に移動する必要がある場合があります。

ウィンドウ内の任意のポイントにポインタを移動するには、 XWarpPointer() を使用します。


例:

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.
33
Bertrand Marron

これは古いですが、誰かがこの問題に遭遇した場合に備えて。 tusbarによって提供された答えは正しかったが、カーソルの位置を更新するには、コマンドXFlush(dpy)を最後に追加する必要があります。必要なライブラリは、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;}
11
Achernar

X11プログラム 呼び出し XWarpPointer 関数を使用して、ポイントを相対位置またはグローバル位置に移動するように記述します。 (Xlibプログラミングマニュアル、第1巻)

一般に、X Window SystemのプログラミングにXlibを使用することは、UnixまたはLinuxシステムでのグラフィカルプログラミングのための最も基本的で非常に低レベルのインターフェイスです。最近のほとんどのアプリケーションは、GUIアプリケーションの開発に [〜#〜] gtk [〜#〜]Qt などの高レベルのライブラリを使用して開発されています。

CursesまたはNCurses(New Curses)は、端末指向のインターフェースをプログラミングするためのものであるため、この場合は役に立ちません。

5
mctylr

XWarpPointer を使用して、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;
3
Blindy

ジョーダンシッセルの優れたユーティリティxdotoolを使用してください。

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

xdo_mousemove()のようなXWarpPointerラッパー関数を提供します。次にいくつかの例を示します。

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;
}
3
plan9assembler

最新の端末はすべて、 ANSIエスケープシーケンス をサポートする必要があります。ただし、より複雑な(そしてより移植性の高い)ものについては、 ncurses などのライブラリの使用を検討する必要があります。

2
aib