21

これは、サンプルのCコードか、GUIを表示するユーティリティか、コンソール上で問題ではないユーティリティのいずれかですが、正確な時間に座標を取得するように「コマンド」できる必要があります。 xevはあまり役に立ちません(私が理解できた)。

4

4 に答える 4

16

私は決してCプログラマーではありませんが、いくつかのオンラインチュートリアルを見て、これが現在のマウスの位置を読み取る方法だと思います。これは私自身のコードであり、以前はXlibで何もしなかったので、完全に壊れている可能性があります(たとえば、エラーハンドラーはすべてのエラーに対して何もしない必要があります)が、機能します。だからここに別の解決策があります:

#include <X11/Xlib.h>
#include <assert.h>
#include <unistd.h>
#include <stdio.h>
#include <malloc.h>

static int _XlibErrorHandler(Display *display, XErrorEvent *event) {
    fprintf(stderr, "An error occured detecting the mouse position\n");
    return True;
}

int main(void) {
    int number_of_screens;
    int i;
    Bool result;
    Window *root_windows;
    Window window_returned;
    int root_x, root_y;
    int win_x, win_y;
    unsigned int mask_return;

    Display *display = XOpenDisplay(NULL);
    assert(display);
    XSetErrorHandler(_XlibErrorHandler);
    number_of_screens = XScreenCount(display);
    fprintf(stderr, "There are %d screens available in this X session\n", number_of_screens);
    root_windows = malloc(sizeof(Window) * number_of_screens);
    for (i = 0; i < number_of_screens; i++) {
        root_windows[i] = XRootWindow(display, i);
    }
    for (i = 0; i < number_of_screens; i++) {
        result = XQueryPointer(display, root_windows[i], &window_returned,
                &window_returned, &root_x, &root_y, &win_x, &win_y,
                &mask_return);
        if (result == True) {
            break;
        }
    }
    if (result != True) {
        fprintf(stderr, "No mouse found.\n");
        return -1;
    }
    printf("Mouse is at (%d,%d)\n", root_x, root_y);

    free(root_windows);
    XCloseDisplay(display);
    return 0;
}
于 2010-08-28T17:18:11.160 に答える
12

xdotoolはこれに最適なツールかもしれません。

Cの場合、libxdoを使用できます。

于 2012-01-03T19:15:39.997 に答える
1

実際、xevは、xwininfoを使用して取得したウィンドウIDを指定すると非常に便利です。そうすれば、このタスクを簡単に実行できます。間違いなくもっとエレガントなソリューションがありますが、それは機能します。

于 2010-08-27T15:50:59.927 に答える
0

xinputを使用して、任意の入力デバイスの完全なデバイス状態を出力できます。

まず、デバイスIDを検出する必要があります。

$ xinput --list | grep -i mouse                                                                                                                                
⎜   ↳ Logitech USB Receiver Mouse               id=11   [slave  pointer  (2)]

次に、状態を要求できます。

$ xinput --query-state 11;
2 classes :
ButtonClass
        button[1]=up
        button[2]=up
        button[3]=up
        button[4]=up
        button[5]=up
        button[6]=up
        button[7]=up
        button[8]=up
        button[9]=up
        button[10]=up
        button[11]=up
        button[12]=up
        button[13]=up
        button[14]=up
        button[15]=up
        button[16]=up
        button[17]=up
        button[18]=up
        button[19]=up
        button[20]=up
ValuatorClass Mode=Relative Proximity=In
        valuator[0]=274
        valuator[1]=886
        valuator[2]=0
        valuator[3]=675

または単にループ:

while sleep .2; do xinput --query-state $(xinput --list | grep -i mouse | cut -d= -f2 | cut -f1| head -1); done
于 2020-01-06T18:40:01.650 に答える