【问题标题】:Catch a "double" hotkey抓住一个“双重”热键
【发布时间】:2013-12-18 09:46:55
【问题描述】:

我必须抓住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 应该很快。但我认为我采取了错误的方式,因为它会变得非常复杂。

你的想法? 附言那里没有窗口,它有一个 global 热键。我也尝试了很多来自互联网的东西,但它没有按我的意愿工作,所以在提供任何代码之前请先测试一下。

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

依赖:

https://github.com/tulskiy/jkeymaster

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

【问题讨论】:

  • com.tulskiy.... 那应该是什么?你能用 Scala Swing 做一个独立的例子吗?
  • @0__,抱歉我忘了。我不能只使用 Swing。
  • @0__,问题是KeyStroke 是一个 Swing 类。
  • 如果有人可以执行您的示例,您获得帮助的机会会高很多

标签: java swing scala hotkeys


【解决方案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 或其他东西包装它。

【讨论】:

  • 这就是我要找的。​​span>
  • 它可以工作,但是,出现了另一个问题。当我可以 Ctrl+C 然后 Ctrl+V 时,不会从剪贴板粘贴任何内容,这意味着那里也不会复制任何内容。我想知道为什么?我希望它不要隐藏系统剪贴板,也就是说,每当我按 Ctrl+C(或 Ctrl+C、C)时,文本都应该被复制到剪贴板。或者至少我想控制它。现在我无法控制。
  • 换句话说,它似乎不允许热键进一步传播。
  • @Alex:在这种情况下,您可能需要使用像 code.google.com/p/jnativehook 这样的键盘钩子
  • 你的图书馆不能传播热键吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2022-06-28
相关资源
最近更新 更多