2013-12-02 3 views
2

Мне нужно поймать горячую клавишу 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 должна быть довольно быстрой. Но я думаю, что я ошибся, так как это будет довольно сложно.

Ваши мысли? P.S. Там нет окна, он ловит глобальную горячую клавишу. Я также пробовал много вещей из Интернета, и он не работал так, как я хотел, поэтому перед тем, как предоставить мне какой-либо код, пожалуйста, проверьте его.

Хотя этот пример - Scala, Java тоже будет в порядке.

Зависимость:

https://github.com/tulskiy/jkeymaster 

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

'com.tulskiy ....' что это должно быть? можете ли вы сделать самостоятельный пример, используя только Scala Swing? –

+0

@ 0__, извините, я забыл об этом. Я не могу использовать только Swing. –

+0

@ 0__, дело в том, что 'KeyStroke' является классом Swing. –

ответ

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() 
     } 
     } 
    } 

если вы хотите что-то без вара, я думаю, вы можете обернуть его в a Promise или что-то в этом роде.

+0

Вот что я искал. –

+0

Это работает, однако, появилась еще одна проблема. Когда я могу Ctrl + C, а затем Ctrl + V, ничего не вставляется из буфера обмена, что означает, что там ничего не копируется. Интересно, почему? Я бы хотел, чтобы он не теневой системный буфер обмена, то есть всякий раз, когда я нажимаю Ctrl + C (или Ctrl + C, C), текст следует скопировать в буфер обмена. Или, по крайней мере, я хотел бы контролировать это. Теперь у меня нет контроля над этим. –

+0

Другими словами, похоже, что горячая клавиша не распространяется дальше. –

Смежные вопросы