我有一个驱动JNativeHook.jar的线程,它创建了一个全局的keybourd和mouse listener。根据用户输入,线程可以这样做。
当用户(让我们说)按下VK_SPACE时,我想停止所有线程执行。我想要生成另一个同时监视键盘的Thread,当它再次获得VK_SPACE时它会告诉主线程恢复。
这种行为在Java中是否可行?它看起来如何?
以下是一些可以使用的代码和JNativeHook。jar
CODE:
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){}
}
答案 0 :(得分: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周期。在你的情况下,我不确定你真的能够纠正它......
答案 1 :(得分: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)
以避免“thread”冲突