2017-01-20 1 views
0

私はCruncherの助けを借りてコードを更新しました。しかし、while(pressed)ループが実行されている間は、他のイベントは&と呼ばれず、実行されたままです。EDIT - Java whileループはイベントが呼び出されないことを意味します

パブリッククラス機能は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ループが呼び出されてからイベントを停止する理由を任意のアイデア?マルチスレッドやそのジャズのいくつかを使用する必要がありますか?

ありがとうございます。

1の場合
+0

だけの推測にごmouseReleaseハンドラを変更しますが、おそらく、その後、最初にマウスクリックイベントの束を、イベントをマウスを送信する必要があり、かつ停止する実際のマウスアップイベントをリッスン。 – Cruncher

+0

@Cruncher "real"イベント?私は押されてリリースされ、ブール値を設定しています。これは間違っていますか? – Archie

+0

私の答えに記載されているコードがあなたに役立ったかどうか教えていただけますか? – Cruncher

答えて

0

、あなたの主な方法は、あなたのコードに含まれていませんが、私はそれが次の行(または類似の)含まれているとします。

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(); 
    } 
} 

さて、このコードを見てみましょう。これが実行されると、プレスは最初(おそらく)にfalseになり、ただ終了し、後のクリックでは実行されません。

クリックを登録すると、ループが開始されます。あなたの他の問題は、最初のmouseRelease後、ハンドラが取得することで表示されます
:それでは、EDIT

@Override 
public void nativeMousePressed(NativeMouseEvent nativeMouseEvent) { 
    if (nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1) 
    { 
     pressed = true; 
     System.out.println(pressed); 
     repeatMouse(); 
    } 
} 

ネイティブフックダウンマウスでそれを呼びましょうのは、別の方法

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(); 
     } 
    } 
} 

に移動してみましょうネイティブライブラリから呼び出されます。私はこれに対して潜在的な解決策を持っています。

あなたpressed変数を定義する場所の隣にまず、次に新しいskipRelease

boolean skipRelease = false; 

を定義mouseReleaseへのすべての呼び出しの前に、最初のセットは、trueにskipRelease。その後、次の

@Override 
public void nativeMouseReleased(NativeMouseEvent nativeMouseEvent) { 
    if (nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1) 
    { 
     if(skipRelease) { 
      skipRelease = false; 
      return; 
     } 
     pressed = false; 
     System.out.println(pressed); 
    } 
} 
+0

大変ありがとう@Cruncher – Archie

+0

しかし、どのように値をfalseにしますか?ボットを使用してリリースをムースにすると、mouseReleaseイベントが呼び出されるため、falseが押されます。右? – Archie

+0

@Archie私はネイティブコールがロボットから登録されないという印象を受けました。しかし、もし彼らがあなたが少し賢い必要があります。私は潜在的な解決策のために私の答えを編集します – Cruncher

関連する問題