2015-01-28 6 views
1

Я пытаюсь перехватить Copy&Paste Горячая клавиша с использованием Java. Для подключения горячих клавиш по всему миру, я использовал JKeyMaster, который отлично работал для , прилагая горячие клавиши на разных ОС.Перехват Горячая клавиша по всему миру, но сохранить исходное поведение

На этот раз, однако, я не хочу прикреплять новую горячую клавишу к ОС. Я просто хочу выполнить код между ними. Поэтому я хочу добавить Hotkey на CTRL + V, и когда я нажимаю его, глобально, я хочу, чтобы он выполнял мое пользовательское поведение до или после (неважно), когда было обработано событие ОС.

Так, например, если у меня есть текст: "Test Text" в моем буфере обмена и жму CTRL +V, прежде чем паста происходит, я хочу, чтобы изменить текст буфера обмена в "New Text".

Есть ли библиотека, которую я могу использовать, чтобы не перезаписывать, а просто перехватить глобальную горячую клавишу?

+0

http://docs.oracle.com/javase/7/docs/api/java/awt/datatransfer/Clipboard.html – Stefan

+0

Я знаю, как получить доступ к буферу. Проблема в том, что мне нужно знать, когда. Точно при нажатии CTRL + V или после. Поэтому мне нужно подключить это ключевое событие по всему миру. Но все библиотеки, которые я нашел, только перезаписывают стандартное поведение. И это не то, что я хочу сделать. – Loki

+0

https://code.google.com/p/jnativehook/ –

ответ

1

Вы можете использовать jnativehook. Из keyboard listener example (немного измененном):

import org.jnativehook.GlobalScreen; 
import org.jnativehook.NativeHookException; 
import org.jnativehook.keyboard.NativeKeyEvent; 
import org.jnativehook.keyboard.NativeKeyListener; 

public class GlobalKeyListenerExample implements NativeKeyListener { 

    boolean isCtrlDown = false; 

    public void nativeKeyPressed(NativeKeyEvent e) { 
     System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode())); 

     if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL_L || e.getKeyCode() == NativeKeyEvent.VC_CONTROL_R) { 
      System.out.println("Ctrl pressed"); 
      isCtrlDown = true; 
     } 

     if (e.getKeyCode() == NativeKeyEvent.VC_V && isCtrlDown) { 
      System.out.println("User hit Ctrl+V"); 
     } 
    } 

    public void nativeKeyReleased(NativeKeyEvent e) { 
     System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode())); 

     if (e.getKeyCode() == NativeKeyEvent.VC_CONTROL_L || e.getKeyCode() == NativeKeyEvent.VC_CONTROL_R) { 
      System.out.println("Ctrl released"); 
      isCtrlDown = false; 
     } 
    } 

    public void nativeKeyTyped(NativeKeyEvent e) {} 

    public static void main(String[] args) { 
     try { 
      GlobalScreen.registerNativeHook(); 
     } 
     catch (NativeHookException ex) { 
      System.err.println("There was a problem registering the native hook."); 
      System.err.println(ex.getMessage()); 
      System.exit(1); 
     } 

     GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample()); 
    } 
} 

Это будет немного глючит, потому что если один удар влево и право Ctrl клавиши, а затем выпустил один из них, но не другой, isCtrlDown будет false. Я не знаю, будет ли это работать на macs, поскольку я не знаю, какую комбинацию для них наклеить.

+0

Я не могу получить файл .jar, созданный с помощью муравья. Хотя я использовал wiki как руководство. Вероятно, мне не хватает какого-то инструмента. Это огромные накладные расходы на занятие, почему бы просто не предоставить файл .jar в github? Извините, я не могу проверить ваш код. – Loki

+0

Есть релизы ... Хорошо. Протестировано, и это выглядит неплохо. Мне не удалось реализовать код для моей реальной проблемы, но я смог получить код выполненный ('System.out') после того, как событие paste действительно завершено. Так что это именно то, что я хотел. спасибо – Loki

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

  • Нет связанных вопросов^_^