java - 检测鼠标单击屏幕上的任意位置

时间:2014-08-26 00:30:32

标签: java mouse detect

我希望我的应用能够在屏幕上的任何位置检测鼠标点击,而无需关注应用。我希望它能够普遍地检测鼠标事件,即使它被最小化。到目前为止,我只能在摇摆gui中检测鼠标事件。

Autohotkey可以随时检测鼠标点击并获取鼠标的位置,我该如何用java做到这一点?

1 个答案:

答案 0 :(得分:1)

有可能用一点技巧。应该是100%跨平台(在Linux和Windows上测试)。基本上,你创建一个小的JWindow,使它“alwaysOnTop”并用鼠标使用计时器移动它。

然后,您可以记录单击,关闭窗口并使用Robot类将单击转发到实际的接收器。

在我的测试中,短暂的左右点击完全正常。

你也可以模拟拖动和点击并保持,只是转发似乎更难。

我有这方面的代码,但它在我的Java扩展(JavaX)中。 JavaX确实转换为Java源代码,因此您可以查看示例here

JavaX中的代码:

static int windowSize = 11; // odd should look nice. Set to 1 for an invisible window
static int clickDelay = 0; // Delay in ms between closing window and forwarding click. 0 seems to work fine.
static int trackingSpeed = 10; // How often to move the window (ms)

p {
  final new JWindow window;
  window.setSize(windowSize, windowSize);
  window.setVisible(true);
  window.setAlwaysOnTop(true);
  JPanel panel = singleColorPanel(Color.red);
  window.setContentPane(panel);
  revalidate(window);
  final new Robot robot;
  panel.addMouseListener(new MouseAdapter {
    // public void mousePressed(final MouseEvent e) {}

    public void mouseReleased(final MouseEvent e) {
      print("release! " + e);
      window.setVisible(false);
      int b = e.getButton();
      final int mod =
        b == 1 ? InputEvent.BUTTON1_DOWN_MASK
        : b == 2 ? InputEvent.BUTTON2_DOWN_MASK
        : InputEvent.BUTTON3_DOWN_MASK;
      swingLater(clickDelay, r {
        print("clicking " + mod);
        robot.mousePress(mod);
        robot.mouseRelease(mod);
      });
    }
  });

  swingEvery(window, trackingSpeed, r {
    Point p = getMouseLocation();
    window.setLocation(p.x-windowSize/2, p.y-windowSize/2);
    //print("moving");
  });
}