Linux:使用假鼠标指针进行Xautomation

时间:2013-12-08 14:22:37

标签: linux mouse xinput

我使用xinput命令创建了一个假的鼠标指针,如here所示,它产生了一个悬浮在屏幕中心的第二个指针。

我现在想使用xte命令自动执行它,但不幸的是xte似乎只能控制我希望保持免费的硬件鼠标。

xte的手册页没有任何标志来指定控制哪个指针。 我想知道是否有人有任何想法?

注意:第二个指针纯粹是为了能够在运行图形管道的同时在同一台计算机上工作


编辑:所以通过查看xte源我找到了对XQueryPointer的引用

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;

//Arguments:
display         Specifies the connection to the X server.
w               Specifies the window.
root_return     Returns the root window that the pointer is in.
child_return    Returns the child window that the pointer is located in, if any.
root_x_return
root_y_return   Return the pointer coordinates relative to the root window's origin.
win_x_return
win_y_return    Return the pointer coordinates relative to the specified window.
mask_return     Returns the current state of the modifier keys and pointer buttons. 
来自Xlib类的

,如您所见,它只返回第一个鼠标指针而不为另一个指针提供选项。


Edit2:浏览libx11-dev源代码我在./src/QuPntr.c和Xlibint.h中找到了它,但是代码越来越难以阅读而且我的深度不在这里< / p>

2 个答案:

答案 0 :(得分:0)

xinput使用XI2扩展来允许多个指针。 该库(X11/extensions/XInput2.h)提供以&#34; XI&#34;为前缀的函数。它接受一个设备参数(由xinput --list引用的相同),例如XIQueryPointer,XIWarpPointer或XIGetClientPointer。 因此,如果您的自动化工具不支持XI2,您可以以编程方式控制假指针。

以更简单的方式,xinput --reattach硬件设备(从设备)到新指针(主设备)就足够了。

我知道很晚的回答,但是我通过网络搜索遇到了这个问题,所以我添加了我知道的内容以供参考。

答案 1 :(得分:0)

实际上,在xte.c的源代码中没有提及XQueryPointer(在xmousepos.c中只有很少的一部分,它是用于其他工具的代码)。 在您问问题之前,我检查了一些旧版本。

相关功能是XIWarpPointer和XTestFakeDeviceButtonEvent。如以下简化的源代码所示:

#include <X11/Xlib.h>
#include <X11/extensions/XInput2.h>
#include <X11/extensions/XTest.h>
int main (int argc, char *argv[])
{
  int delta_x = 500, delta_y = 160;
  Display *display = XOpenDisplay(0);
  Window root = DefaultRootWindow(display);
  XIWarpPointer(display, 14, None, root, 0, 0, 0, 0, delta_x, delta_y);
  XDevice *device = NULL;
  device = XOpenDevice(display, 16);
  XTestFakeDeviceButtonEvent(display, device, 1, True, 0, 0, CurrentTime);
  XTestFakeDeviceButtonEvent(display, device, 1, False, 0, 0, CurrentTime);
  XCloseDisplay(display);
}

xte -i 16“ mousemove 500 160”“ mouseclick 1” 具有相同的作用。

但是什么可能困扰您(至少让我感到困扰):被单击的Windows获得了焦点,实际上使您无法处理正在工作的窗口。
实际上,我最近问了一个问题,要求使用XTestFakeDeviceButtonEvent的替代方法(Sending a button press event for a second pointing device;我还提供了一些示例代码,这些代码实际上执行鼠标单击而没有将焦点放在窗口上,因此有可能,但不知道如何通过另一个指向完成设备).. 一种替代方法是像该用户那样使用多个X会话:Controlling multiple pointers with Xlib or xinput in ubuntu/linux。可悲的是他没有共享任何代码。 我对uinput(https://www.kernel.org/doc/html/v4.12/input/uinput.html)有一些希望,但是还没有尝试过。