我必须抓住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"
答案 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
或其他东西包装它。