我正在尝试创建一个示例应用程序,该应用程序使用 jNativeHook 库在 Windows 机器上监视来自 scala 的击键。
我有以下监听事件的监听器,
object KeyListener extends org.jnativehook.keyboard.NativeKeyListener {
val keyPressedActor = implicitly[ActorSystem].actorOf(Props[KeyPressedActor](), "KeyPressedActor")
def nativeKeyPressed(event: NativeKeyEvent): Unit = {
keyPressedActor ! event
}
//blank override two more methods.
}
插入监听器的主驱动应用程序,
object ConsoleApp extends App {
try {
GlobalScreen.registerNativeHook();
GlobalScreen.addNativeKeyListener(KeyListener)
} catch {
case nativehookException: NativeHookException => System.out.println("Encountered error while Hooking to global screen" + nativehookException.fillInStackTrace())
case ex: Exception => System.out.println("Miserable ! Shouldn't have happened ." + ex.fillInStackTrace())
}
}
这是我想将击键存储在某个集合中的演员的实现,
class KeyPressedActor extends Actor {
var testQueue = new scala.collection.mutable.Queue[String]()
def receive = {
case event: NativeKeyEvent =>
if (event.paramString().contains("modifiers=Ctrl")) {
testQueue.enqueue("this_is_test")
}
case _ => System.out.println("Bummer ! You are NOT supposed to see THIS !")
}
}
现在我看到每次演员进入我们向队列添加字符串的块时,它不记得插入其中的最后一个元素。
我不明白为什么会这样。如果我只有一个向参与者发送消息的主应用程序,则不会出现此问题。我无法解释为什么会发生这种情况。
更新 :
实际上,我最初没有在此处复制的部分中的代码还有其他内容。所以如果我if
在演员的街区里有这个,
NativeKeyEvent.getKeyText(event.getKeyCode) match {
case "C" =>
isCPressed = true
case "V" => isVPressed = true
case "N" => isNPressed = true
观察到这种行为。我将此代码更改为此,
val keyCode = NativeKeyEvent.getKeyText(event.getKeyCode)
if (keyCode.equalsIgnoreCase("c")) {
testQueue.enqueue("this_is_test")
}
我想知道这是否意味着该match
语句在某些不同的上下文/线程上运行???