编辑 - Java while 循环意味着不调用事件
EDIT - Java while loop means events aren't called
所以我在 Cruncher 的帮助下更新了我的代码,现在答题器似乎工作得更好了。然而,虽然 while(pressed) 循环是 运行,但没有其他事件被调用,所以它保持 运行.
public class 函数实现 NativeMouseListener {
private Robot robot;
private boolean pressed = false;
private boolean skip = false;
public Function()
{
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
}
private void repeatMouse()
{
skip = true;
robot.mouseRelease(InputEvent.BUTTON1_MASK);
while (pressed)
{
System.out.println("pressed while loop " + pressed);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void nativeMouseClicked(NativeMouseEvent nativeMouseEvent) {
}
@Override
public void nativeMousePressed(NativeMouseEvent nativeMouseEvent) {
System.out.println("GG");
if (!(nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)) {
System.out.println("Returned.");
return;
}
if (!Native.get().getData().getEnabled())
{
System.out.println("Isn't enabled.");
return;
}
pressed = true;
repeatMouse();
}
@Override
public void nativeMouseReleased(NativeMouseEvent nativeMouseEvent) {
System.out.println("released");
if (!(nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)) {
System.out.println("Returned 2");
return;
}
if (!skip)
{
System.out.println("pressed " + pressed);
pressed = false;
System.out.println("pressed " + pressed);
} else {
skip = false;
}
}
}
知道为什么 while 循环会阻止事件被调用吗?我需要使用多线程还是一些爵士乐?
谢谢。
一方面,您的主要方法未包含在您的代码中,但我认为它包含以下行(或类似行):
new Project()
try {
bot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
while (pressed) {
bot.mousePress(InputEvent.BUTTON1_MASK);
//bot.mouseRelease(InputEvent.BUTTON1_MASK);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
现在让我们看一下这段代码。当它运行时,pressed 将在开始时为 false(大概),它只会退出而不是 运行 在以后的点击中。
您要做的是在注册点击时启动循环。让我们把它移到另一个方法中
private void repeatMouse() {
bot.mouseRelease(InputEvent.BUTTON1_MASK);
while (pressed) {
bot.mousePress(InputEvent.BUTTON1_MASK);
bot.mouseRelease(InputEvent.BUTTON1_MASK);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
现在让我们在您的鼠标按下原生钩子中调用它
@Override
public void nativeMousePressed(NativeMouseEvent nativeMouseEvent) {
if (nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)
{
pressed = true;
System.out.println(pressed);
repeatMouse();
}
}
编辑:
看来您的另一个问题是,在第一次 mouseRelease 之后,将从本机库调用处理程序。我有一个潜在的解决方案。
首先在定义 pressed
变量的位置旁边,定义一个新的 skipRelease
boolean skipRelease = false;
然后在每次调用 mouseRelease 之前,首先将 skipRelease 设置为 true。然后将您的 mouseRelease 处理程序更改为以下
@Override
public void nativeMouseReleased(NativeMouseEvent nativeMouseEvent) {
if (nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)
{
if(skipRelease) {
skipRelease = false;
return;
}
pressed = false;
System.out.println(pressed);
}
}
所以我在 Cruncher 的帮助下更新了我的代码,现在答题器似乎工作得更好了。然而,虽然 while(pressed) 循环是 运行,但没有其他事件被调用,所以它保持 运行.
public class 函数实现 NativeMouseListener {
private Robot robot;
private boolean pressed = false;
private boolean skip = false;
public Function()
{
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
}
private void repeatMouse()
{
skip = true;
robot.mouseRelease(InputEvent.BUTTON1_MASK);
while (pressed)
{
System.out.println("pressed while loop " + pressed);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void nativeMouseClicked(NativeMouseEvent nativeMouseEvent) {
}
@Override
public void nativeMousePressed(NativeMouseEvent nativeMouseEvent) {
System.out.println("GG");
if (!(nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)) {
System.out.println("Returned.");
return;
}
if (!Native.get().getData().getEnabled())
{
System.out.println("Isn't enabled.");
return;
}
pressed = true;
repeatMouse();
}
@Override
public void nativeMouseReleased(NativeMouseEvent nativeMouseEvent) {
System.out.println("released");
if (!(nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)) {
System.out.println("Returned 2");
return;
}
if (!skip)
{
System.out.println("pressed " + pressed);
pressed = false;
System.out.println("pressed " + pressed);
} else {
skip = false;
}
}
}
知道为什么 while 循环会阻止事件被调用吗?我需要使用多线程还是一些爵士乐?
谢谢。
一方面,您的主要方法未包含在您的代码中,但我认为它包含以下行(或类似行):
new Project()
try {
bot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
while (pressed) {
bot.mousePress(InputEvent.BUTTON1_MASK);
//bot.mouseRelease(InputEvent.BUTTON1_MASK);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
现在让我们看一下这段代码。当它运行时,pressed 将在开始时为 false(大概),它只会退出而不是 运行 在以后的点击中。
您要做的是在注册点击时启动循环。让我们把它移到另一个方法中
private void repeatMouse() {
bot.mouseRelease(InputEvent.BUTTON1_MASK);
while (pressed) {
bot.mousePress(InputEvent.BUTTON1_MASK);
bot.mouseRelease(InputEvent.BUTTON1_MASK);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
现在让我们在您的鼠标按下原生钩子中调用它
@Override
public void nativeMousePressed(NativeMouseEvent nativeMouseEvent) {
if (nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)
{
pressed = true;
System.out.println(pressed);
repeatMouse();
}
}
编辑:
看来您的另一个问题是,在第一次 mouseRelease 之后,将从本机库调用处理程序。我有一个潜在的解决方案。
首先在定义 pressed
变量的位置旁边,定义一个新的 skipRelease
boolean skipRelease = false;
然后在每次调用 mouseRelease 之前,首先将 skipRelease 设置为 true。然后将您的 mouseRelease 处理程序更改为以下
@Override
public void nativeMouseReleased(NativeMouseEvent nativeMouseEvent) {
if (nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)
{
if(skipRelease) {
skipRelease = false;
return;
}
pressed = false;
System.out.println(pressed);
}
}