抓住一个“双”热键

时间:2013-12-02 16:00:41

标签: java swing scala hotkeys

我必须抓住Ctrl+Alt+C, C的热键(意思是,按Ctrl+Alt+C,仅发布C并再按一次)。这是我正在尝试做的事情:

import com.tulskiy.keymaster.common._
import java.awt.event._
import javax.swing.KeyStroke

class KeysCatcher {

  val provider = Provider.getCurrentProvider(true)
  val ctrlC = KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK + ActionEvent.ALT_MASK)

  val listener = new HotKeyListener() {
    def onHotKey(hotKey: HotKey): Unit = {
      hotKey.keyStroke match {
        case `ctrlC` =>
          println("Ctrl+Alt+C 1 was pressed")

          val listener2 = new HotKeyListener() {
            def onHotKey(hotKey: HotKey): Unit = {
              hotKey.keyStroke match {
                case `ctrlC` => println("Ctrl+Alt+C 2 was pressed")
              }
            }
          }

          provider.register(ctrlC, listener2)
      }
    }
  }

  provider.register(ctrlC, listener)
}

我有一个想法,一旦按下Ctrl+Alt+C,我必须再次注册相同的热键并抓住它。因为C的第二次印刷应该非常快,所以我将涉及一个计时器。但我认为我采取了错误的方式,因为它会变得非常复杂。

你的想法? 附:那里没有窗口,它会捕获全局热键。我也尝试过很多来自互联网的东西,它没有按照我的意愿工作,所以在提供任何代码之前请先测试一下。

虽然这个例子是Scala,但Java也可以。

相关性:

https://github.com/tulskiy/jkeymaster

//build.scala
val jkeymaster = "com.github.tulskiy" % "jkeymaster" % "1.1" 

1 个答案:

答案 0 :(得分:2)

您只能注册一次全局热键,但您可以多次在处理程序中接收其事件。所以基本的想法是保存你上次看到这个密钥的时间,如果有两个在一定的延迟之间,你可以双击:

    var last = 0l
    val listener = new HotKeyListener() {
      def onHotKey(hotKey: HotKey): Unit = {
        hotKey.keyStroke match {
          case `ctrlC` =>
            if (System.currentTimeMillis() - last < 700) // arbitrary delay of 700 ms
              println("We have a double click!")
            else last = System.currentTimeMillis()
        }
      }
    }

如果你想要一些没有var的东西,我想你可以用Promise或其他东西包装它。