如何在不覆盖实际鼠标的情况下鼠标单击任何 Java 组件

Hes*_*urg 3 java swing autoit

目前为了在我的应用程序中模拟鼠标点击,我使用了 Java 的 Robot 类。它似乎使用桌面作为边界/网格来了解 Point 在屏幕上的映射位置。

例子:

Robot bot = new Robot();
bot.mouseMove(1099,22); //Manually collected point..
bot.delay(100);
bot.mousePress(InputEvent.BUTTON1_MASK);
bot.mouseRelease(InputEvent.BUTTON1_MASK);
Run Code Online (Sandbox Code Playgroud)

目标:

机器人强制使用我的鼠标/光标,我希望能够在我的计算机上做其他事情,而这段代码运行时只点击我编程的 Java 应用程序。

有没有办法用 JNA 做到这一点?我不关心支持除 Windows 之外的任何操作系统,但由于遗留技术,仍然需要成为 Java 应用程序。

Nat*_*han 5

以下代码在target相对于 的 (x, y) 处单击组件target

private static void click(Component target, int x, int y)
{
   MouseEvent press, release, click;
   Point point;
   long time;

   point = new Point(x, y);

   SwingUtilities.convertPointToScreen(point, target);

   time    = System.currentTimeMillis();
   press   = new MouseEvent(target, MouseEvent.MOUSE_PRESSED,  time, 0, x, y, point.x, point.y, 1, false, MouseEvent.BUTTON1);
   release = new MouseEvent(target, MouseEvent.MOUSE_RELEASED, time, 0, x, y, point.x, point.y, 1, false, MouseEvent.BUTTON1);
   click   = new MouseEvent(target, MouseEvent.MOUSE_CLICKED,  time, 0, x, y, point.x, point.y, 1, false, MouseEvent.BUTTON1);

   target.dispatchEvent(press);
   target.dispatchEvent(release);
   target.dispatchEvent(click);
}
Run Code Online (Sandbox Code Playgroud)