小编典典

赶上“双”热键

java

我必须接一个热键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应该很快。但是我认为我走错了路,因为这会使事情变得非常复杂。

你的想法?PS那里没有窗口,它捕获了 全局
热键。我还尝试了Internet上的很多东西,但是它并没有按我想要的那样工作,因此在向我提供任何代码之前,请对其进行测试。

尽管此示例为Scala,但Java也可以。

依赖关系:

https://github.com/tulskiy/jkeymaster

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

阅读 248

收藏
2020-11-26

共1个答案

小编典典

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

    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的东西,我想您可以将其包装在a Promise或其他东西中。

2020-11-26