我必须接一个热键Ctrl+Alt+C, C(意思是,按Ctrl+Alt+C,仅释放C,然后再按一次)。这是我想做的事情:
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"
您只能注册一次全局热键,但是您可以在处理程序中多次接收其事件。因此,基本思想是保存上次看到此键的时间,如果两次之间有一定延迟,则可以双击:
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或其他东西中。
Promise