java - Detect Mouse Clicks Anywhere On Screen

醉酒当歌 提交于 2019-11-27 08:33:07

问题


I want my app to detect mouse clicks anywhere on the screen without having to have the app focused. I want it to detect mouse events universally even if its minimized. So far I've only been able to detect mouse events within a swing gui.

Autohotkey can detect mouse clicks and get the mouse's position at any time, how can I do this with java?


回答1:


It is possible with a little trick. Should be 100% cross-platform (tested on Linux & Windows). Basically, you create a small JWindow, make it "alwaysOnTop" and move it around with the mouse using a timer.

Then, you can record the click, dismiss the window and forward the click to the actual receiver using the Robot class.

Short left and right clicks work completely fine in my tests.

You could also simulate dragging and click-and-hold, just forwarding that seems harder.

I have code for this, but it is in my Java extension (JavaX). JavaX does translate into Java source code, so you can check out the example here.

The code in 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");
  });
}


来源:https://stackoverflow.com/questions/25496292/java-detect-mouse-clicks-anywhere-on-screen

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!