3

画面上の任意の場所で Xlib を使用してマウスクリックの x 座標と y 座標を取得する方法を知りたいです。現在のポインター位置を取得するこの投稿を見つけました

Xで現在のマウス (ポインター) の位置座標を取得するにはどうすればよいですか?

しかし、マウスをクリックするとxy座標​​を取得するように変更する方法がわかりません。このコードを書き込もうとしましたが、何もしません。

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

int main (){
int x=-1,y=-1;
XEvent event;
int button;
Display *display = XOpenDisplay(NULL);
if (display == NULL) {
    fprintf(stderr, "Cannot connect to X server!\n");
    exit (EXIT_FAILURE);
}
Window root= XDefaultRootWindow(display);
XSelectInput(display, root, ButtonReleaseMask) ;
while(1){
XNextEvent(display,&event);
switch(event.type){
    case ButtonRelease:
        switch(event.xbutton.button){
            case Button1:
                x=event.xbutton.x;
                y=event.xbutton.y;
                button=Button1;
                break;

            case Button3:
                x=event.xbutton.x;
                y=event.xbutton.y;
                button=Button3;
                break;
            default:
                break;

        }
        break;
    default:
        break;
}
if(x>=0 && y>=0)break;
}
if(button==Button1)printf("leftclick at %d %d \n",x,y);
else printf("rightclick at %d %d \n",x,y);
XCloseDisplay(display);
return 0;
}

イベントはおそらく他のウィンドウに送信され、それが機能していない理由です。もう 1 つの問題は、ButtonPressMask を XSelectInput 関数に追加すると、次のエラーが発生することです。

X Error of failed request:  BadAccess (attempt to access private resource denied)
Major opcode of failed request:  2 (X_ChangeWindowAttributes)
Serial number of failed request:  7
Current serial number in output stream:  7

Cでこれを行う簡単な方法があれば、それを聞いてうれしいです.

4

3 に答える 3

4

私はこれが数年先であることを知っているので、これは他の人にとっての情報です. まず、さらに別のライブラリを使用することは、私の定義であるより簡単ではありません。私は xlib と C のみを使用してこれを必要とする何かに取り組んでいましたが、コードをどれだけ簡単に作成できるかを確認したかったのです。

基本的に、既存のプログラムの x​​lib でこれを行うには 4 行のコードしか必要ありません。残りはすべて、printf/sprintf、grab_pixel_color(Display *display、XColor *color) などの処理方法にあります。

/** gcc position.c -o position -lX11 **/
#include <X11/Xlib.h>
#include <stdio.h>

int main (int argc, char **argv) {
    Window root_window; //<--one
    int root_x, root_y; //<--two
    unsigned int mask; //<--three

    Display *display = XOpenDisplay(NULL);

    /*
    Bool XQueryPointer(display, w, root_return, child_return, root_x_return, root_y_return,
                         win_x_return, win_y_return, mask_return)
          Display *display;
          Window w;
          Window *root_return, *child_return;
          int *root_x_return, *root_y_return;
          int *win_x_return, *win_y_return;
          unsigned int *mask_return;
    */

    XQueryPointer(display, DefaultRootWindow(display), &root_window, &root_window, &root_x, &root_y, &root_x, &root_y, &mask); //<--four

    printf("Mouse coordinates (X: %d, Y: %d)\n", root_x, root_y);

    XCloseDisplay(display);
    return 0;
}

これが他の誰かに役立つことを願っています。

于 2016-10-03T16:40:16.253 に答える
3

おそらく、ポインタをつかむ必要があります。

リリースのボタンを押したいだけかどうかはわかりません。プレスに変更しましたが、次の方法で両方を取得できます。

XSelectInput(display, root, ButtonPressMask|ButtonReleaseMask) ;

ButtonRelease ケースを再び追加します。

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

int main (){
    int x=-1,y=-1;
    XEvent event;
    int button;
    Display *display = XOpenDisplay(NULL);
    if (display == NULL) {
    fprintf(stderr, "Cannot connect to X server!\n");
    exit (EXIT_FAILURE);
    }
    Window root= XDefaultRootWindow(display);
    XGrabPointer(display, root, False, ButtonPressMask, GrabModeAsync,
         GrabModeAsync, None, None, CurrentTime);

    XSelectInput(display, root, ButtonPressMask) ;
    while(1){
    XNextEvent(display,&event);
    switch(event.type){
    case ButtonPress:
        switch(event.xbutton.button){
        case Button1:
        x=event.xbutton.x;
        y=event.xbutton.y;
        button=Button1;
        break;

        case Button3:
        x=event.xbutton.x;
        y=event.xbutton.y;
        button=Button3;
        break;
        default:
        break;

        }
        break;
    default:
        break;
    }
    if(x>=0 && y>=0)break;
    }
    if(button==Button1)printf("leftclick at %d %d \n",x,y);
    else printf("rightclick at %d %d \n",x,y);
    XCloseDisplay(display);
    return 0;
}
于 2013-04-21T08:15:36.880 に答える
1

Cでこれを行う簡単な方法があれば、それを聞いてうれしいです.

完全!次に、一部の人々がすでに作成したlibxdo ライブラリを使用します。

int x, y, scrn;

xdo_t *hndl = xdo_new(NULL);
xdo_mouselocation(hndl, &x, &y, &scrn);
xdo_free(hndl);

printf("Mouse coordinates: x = %4d, y = %4d\n", x, y);
于 2013-04-20T15:51:16.620 に答える