抓住一个“双”热键

我必须抓住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那里没有窗口,它捕获了一个全球热键。 我也尝试了很多来自互联网的东西,它没有按我的意愿工作,所以在提供任何代码之前请测试一下。

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

相关性:

 https://github.com/tulskiy/jkeymaster //build.scala val jkeymaster = "com.github.tulskiy" % "jkeymaster" % "1.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的东西,我想你可以将它包装在Promise

Interesting Posts