我希望我的应用能够在屏幕上的任何位置检测鼠标点击,而无需关注应用.我希望它能够普遍地检测鼠标事件,即使它被最小化.到目前为止,我只能在摇摆gui中检测鼠标事件.
Autohotkey可以随时检测鼠标点击并获取鼠标的位置,我该如何使用java?
解决方法:
这可能是一个小技巧.应该是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");
});
}