java - Detect Mouse Clicks Anywhere On Screen

前端 未结 1 1099
你的背包
你的背包 2020-12-04 03:26

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 fa

相关标签:
1条回答
  • 2020-12-04 03:38

    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");
      });
    }
    
    0 讨论(0)
提交回复
热议问题