0

グローバルなキーボードとマウスのリスナーを作成する JNativeHook.jar を実行するスレッドがあります。ユーザー入力に基づいて、スレッドはそのように機能します。

ユーザーが(たとえば)VK_SPACEを押したときに、すべてのスレッドの実行を停止したいと思います。キーボードも監視する別のスレッドを生成したいと思います.VK_SPACEを再度取得すると、メインスレッドに再開するように指示します.

この種のアクションは Java で可能ですか? また、どのように見えるでしょうか?

以下は、使用するコードとJNativeHook .jarです。

コード:

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class GlobalKeyListenerExample implements NativeKeyListener 
{
public void nativeKeyPressed(NativeKeyEvent e) 
{
    System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));

    if (e.getKeyCode() == NativeKeyEvent.VK_ESCAPE) 
    {
        GlobalScreen.unregisterNativeHook();
    }
    if (e.getKeyCode() == NativeKeyEvent.VK_SPACE) 
    {
            WatchForMe w = new WatchForMe(this);
            w.start();
            this.wait();
    }
}

public void nativeKeyReleased(NativeKeyEvent e){}
public void nativeKeyTyped(NativeKeyEvent e){}

public static void main(String[] args) 
{
    try 
    {
        GlobalScreen.registerNativeHook();
    }
    catch (NativeHookException ex) 
    {
        System.err.println("There was a problem registering the native hook.");
        System.exit(1);
    }

    //Construct the example object and initialze native hook.
    GlobalScreen.getInstance().addNativeKeyListener(new GlobalKeyListenerExample());
}
}

public class WatchForMe implements NativeKeyListener 
{
boolean alive = true;
Thread me = null;
public WatchForMe(Thread me)
{
    if(me == null) return;
    this.me = me;
    GlobalScreen.getInstance().addNativeKeyListener(this);
}
public void nativeKeyPressed(NativeKeyEvent e) 
{
        System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
        if (e.getKeyCode() == NativeKeyEvent.VK_SPACE) 
        {
                me.notify(); 
                alive = false;
        }
}
 public void run()
 {
     while(alive){}
 }

public void nativeKeyReleased(NativeKeyEvent e){}
public void nativeKeyTyped(NativeKeyEvent e){}
}
4

2 に答える 2

0

さまざまなモニターやものをロックしようとして走り回る代わりに、個人的にはGlobalKeyListenerExample、特定のキーの組み合わせが検出されると、特定のキーの組み合わせが発生するまで、それ以上の着信キーを無視し始めるというフラグを設定します。

あなたが現在直面している問題は、1-どのスレッドにいて、それが「一時停止」する可能性のある影響を知ることと、2-「一時停止解除」の組み合わせがいつ発生するかを知ることです...キーイベントを聞いていないためです(ネイティブインターフェースがイベントを発生させるために使用していたスレッドを誤って停止した可能性があるため...)

public void nativeKeyPressed(NativeKeyEvent e) 
{
    System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));

    if (isPaused) {
        if (e.getKeyCode == UNPAUSE_KEY_CODE) { 
            isPaused = false;
        }
    } else {
        if (e.getKeyCode == PAUSE_KEY_CODE) { 
            isPaused = true;
        } else {
            // Handle other key strokes...
        }
    }
}

更新しました

余談ですが・・・これ

public void run()
{
    while(alive){}
}

いい考えですね。基本的に、スレッドを「実行中」の状態のままにして、不必要に CPU サイクルを消費します。あなたの場合、実際にどのように修正できるかわかりません...

于 2013-01-30T02:25:53.143 に答える
0

メソッド実行中:

public void run(){
 while(me!=null) //execute forever
   try{
      Thread.sleep(5);
      if(!alive) continue; //define pause

      ... do somthing   
   catch(Exception e){}

この「一時停止」かどうかを常にチェックして「スレッド」にとどまる必要があります。

重要!public synchronized void setAlive (boolean value)「スレッド」の競合を回避する方法を使用することをお勧めします

于 2013-01-30T02:32:08.973 に答える