linuxでCプログラムを使用してXウィンドウでmouseカーソル位置を設定するにはどうすればよいですか?ありがとう:)(WINのsetcursorpos()のように)
編集:私はこのコードを試しましたが、機能しません:
#include <curses.h>
main(){
move(100, 100);
refresh();
}
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.
これは古いですが、誰かがこの問題に遭遇した場合に備えて。 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;}
X11プログラム 呼び出し XWarpPointer
関数を使用して、ポイントを相対位置またはグローバル位置に移動するように記述します。 (Xlibプログラミングマニュアル、第1巻)
一般に、X Window SystemのプログラミングにXlibを使用することは、UnixまたはLinuxシステムでのグラフィカルプログラミングのための最も基本的で非常に低レベルのインターフェイスです。最近のほとんどのアプリケーションは、GUIアプリケーションの開発に [〜#〜] gtk [〜#〜] や Qt などの高レベルのライブラリを使用して開発されています。
CursesまたはNCurses(New Curses)は、端末指向のインターフェースをプログラミングするためのものであるため、この場合は役に立ちません。
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;
ジョーダンシッセルの優れたユーティリティ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;
}
最新の端末はすべて、 ANSIエスケープシーケンス をサポートする必要があります。ただし、より複雑な(そしてより移植性の高い)ものについては、 ncurses などのライブラリの使用を検討する必要があります。