0

我正在尝试创建一个示例应用程序,该应用程序使用 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语句在某些不同的上下文/线程上运行???

4

0 回答 0