2015-05-13 15 views
5

Jak emulować naciśnięcie klawiszy multimedialnych w Java? Takich jak odtwarzanie/pauza, następny/poprzedni, regulacja głośności.Jak naśladować naciśnięcie klawiszy mediów w Javie?

C# ma VK_MEDIA_PLAY_PAUSE, VK_MEDIA_NEXT_TRACK i tak dalej.

Java ma klasę Robot do pracy z kluczami, ale nie istnieją żadne klawisze multimedialne.

+0

http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html –

+1

@Luis To nie pomaga OP. Uruchomiłem dostarczoną wersję demonstracyjną 'KeyListener' i nie rozpoznałem kluczy multimedialnych mojej klawiatury. – CubeJockey

+0

Tak. Masz rację. Zrobiłem to również po wklejeniu linku. Myślę, że nie jest możliwe w 'Java': http://stackoverflow.com/questions/6236303/keyevent-special-keys-like-mute –

Odpowiedz

1

Stwórz własną KeyListener i szpiegiem, co przychodzi, a następnie użyć tej wartości. Oto prosty KeySpy klasa:

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 


public class KeySpy { 
    JLabel label=new JLabel("Enter the key"); 
    public KeySpy() { 
     JFrame frame=new JFrame("KeySpy"); 
     frame.add(label); 

     frame.addKeyListener(new KeyListener() { 

      @Override 
      public void keyTyped(KeyEvent e) { 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
      } 

      @Override 
      public void keyPressed(KeyEvent e) { 
       label.setText(e.toString()); 
       System.out.println(e.toString()); 
      } 
     }); 

     frame.setSize(200, 200); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new KeySpy(); 

    } 

} 

i oto wynik na 2 guziki na klawiaturze

[Stop] = java.awt.event.KeyEvent[KEY_PRESSED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=178,primaryLevelUnicode=0,scancode=36,extendedKeyCode=0x0] on frame0 

    [Mute] = java.awt.event.KeyEvent[KEY_PRESSED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_STANDARD,rawCode=173,primaryLevelUnicode=0,scancode=32,extendedKeyCode=0x0] on frame0 

Jak widać nie mają keyCode ale mają rawCode - tak go używać.

2

poprawiłem Alex's KeySpy application. JFrame trzyma ostrość, dzięki czemu można zminimalizować lub zmaksymalizować aplikację i nadal naciśnij dowolny klawisz, gdy aplikacja jest w centrum uwagi.

Oto GUI.

KeySpy GUI

umieścić informacje w siatce etykieta/wartość, aby łatwiej znaleźć wartość (y), że jesteś zainteresowany.

A oto kod. To jest dobry przykład GridBagLayout.

package com.ggl.testing; 

import java.awt.Component; 
import java.awt.Container; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class KeySpy implements Runnable { 

    private KeySpyPanel keySpyPanel; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new KeySpy()); 
    } 

    @Override 
    public void run() { 
     final JFrame frame = new JFrame("Key Spy"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 
     frame.addWindowFocusListener(new WindowAdapter() { 
      public void windowGainedFocus(WindowEvent e) { 
       frame.requestFocusInWindow(); 
      } 
     }); 

     keySpyPanel = new KeySpyPanel(); 
     frame.add(keySpyPanel.getPanel()); 
     frame.addKeyListener(new KeyPressedListener(this)); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public KeySpyPanel getKeySpyPanel() { 
     return keySpyPanel; 
    } 

    public class KeySpyPanel { 

     private final Insets bottomInsets = new Insets(10, 10, 10, 10); 
     private final Insets normalInsets = new Insets(10, 10, 0, 10); 

     private JPanel panel; 

     private JTextField keyCodeField; 
     private JTextField keyTextField; 
     private JTextField keyCharField; 
     private JTextField keyLocationField; 
     private JTextField modifiersField; 
     private JTextField extModifiersField; 
     private JTextField rawCodeField; 
     private JTextField primaryLevelUnicodeField; 
     private JTextField scancodeField; 
     private JTextField extendedKeyCodeField; 

     public KeySpyPanel() { 
      createPartControl(); 
     } 

     private void createPartControl() { 
      panel = new JPanel(); 
      panel.setLayout(new GridBagLayout()); 

      int gridy = 0; 

      JLabel anyKeyLabel = new JLabel("Press any key"); 
      anyKeyLabel.setFont(anyKeyLabel.getFont().deriveFont(36F)); 
      anyKeyLabel.setHorizontalAlignment(JLabel.CENTER); 
      addComponent(panel, anyKeyLabel, 0, gridy++, 2, 1, normalInsets, 
        GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL); 

      JLabel keyCodeLabel = new JLabel("KeyCode:"); 
      addComponent(panel, keyCodeLabel, 0, gridy, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      keyCodeField = new JTextField(20); 
      keyCodeField.setEditable(false); 
      addComponent(panel, keyCodeField, 1, gridy++, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      JLabel keyTextLabel = new JLabel("KeyText:"); 
      addComponent(panel, keyTextLabel, 0, gridy, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      keyTextField = new JTextField(20); 
      keyTextField.setEditable(false); 
      addComponent(panel, keyTextField, 1, gridy++, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      JLabel keyCharLabel = new JLabel("KeyChar:"); 
      addComponent(panel, keyCharLabel, 0, gridy, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      keyCharField = new JTextField(20); 
      keyCharField.setEditable(false); 
      addComponent(panel, keyCharField, 1, gridy++, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      JLabel keyLocationLabel = new JLabel("KeyLocation:"); 
      addComponent(panel, keyLocationLabel, 0, gridy, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      keyLocationField = new JTextField(20); 
      keyLocationField.setEditable(false); 
      addComponent(panel, keyLocationField, 1, gridy++, 1, 1, 
        normalInsets, GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      JLabel modifiersLabel = new JLabel("Modifiers:"); 
      addComponent(panel, modifiersLabel, 0, gridy, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      modifiersField = new JTextField(20); 
      modifiersField.setEditable(false); 
      addComponent(panel, modifiersField, 1, gridy++, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      JLabel extModifiersLabel = new JLabel("ExtModifiers:"); 
      addComponent(panel, extModifiersLabel, 0, gridy, 1, 1, 
        normalInsets, GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      extModifiersField = new JTextField(20); 
      extModifiersField.setEditable(false); 
      addComponent(panel, extModifiersField, 1, gridy++, 1, 1, 
        normalInsets, GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      JLabel rawCodeLabel = new JLabel("RawCode:"); 
      addComponent(panel, rawCodeLabel, 0, gridy, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      rawCodeField = new JTextField(20); 
      rawCodeField.setEditable(false); 
      addComponent(panel, rawCodeField, 1, gridy++, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      JLabel primaryLevelUnicodeLabel = new JLabel("PrimaryLevelUnicode:"); 
      addComponent(panel, primaryLevelUnicodeLabel, 0, gridy, 1, 1, 
        normalInsets, GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      primaryLevelUnicodeField = new JTextField(20); 
      primaryLevelUnicodeField.setEditable(false); 
      addComponent(panel, primaryLevelUnicodeField, 1, gridy++, 1, 1, 
        normalInsets, GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      JLabel scancodeLabel = new JLabel("Scancode:"); 
      addComponent(panel, scancodeLabel, 0, gridy, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      scancodeField = new JTextField(20); 
      scancodeField.setEditable(false); 
      addComponent(panel, scancodeField, 1, gridy++, 1, 1, normalInsets, 
        GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      JLabel extendedKeyCodeLabel = new JLabel("ExtendedKeyCode:"); 
      addComponent(panel, extendedKeyCodeLabel, 0, gridy, 1, 1, 
        bottomInsets, GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 

      extendedKeyCodeField = new JTextField(20); 
      extendedKeyCodeField.setEditable(false); 
      addComponent(panel, extendedKeyCodeField, 1, gridy++, 1, 1, 
        bottomInsets, GridBagConstraints.LINE_START, 
        GridBagConstraints.HORIZONTAL); 
     } 

     private void addComponent(Container container, Component component, 
       int gridx, int gridy, int gridwidth, int gridheight, 
       Insets insets, int anchor, int fill) { 
      GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, 
        gridwidth, gridheight, 1.0D, 1.0D, anchor, fill, insets, 0, 
        0); 
      container.add(component, gbc); 
     } 

     public JPanel getPanel() { 
      return panel; 
     } 

     public void setKeyPressed(KeyEvent event) { 
      String s = event.toString(); 

      keyCodeField.setText(getValue("keyCode", s)); 
      keyTextField.setText(getValue("keyText", s)); 
      keyCharField.setText(getValue("keyChar", s)); 
      keyLocationField.setText(getValue("keyLocation", s)); 
      modifiersField.setText(getValue("modifiers", s)); 
      extModifiersField.setText(getValue("extModifiers", s)); 
      rawCodeField.setText(getValue("rawCode", s)); 
      primaryLevelUnicodeField 
        .setText(getValue("primaryLevelUnicode", s)); 
      scancodeField.setText(getValue("scancode", s)); 
      extendedKeyCodeField.setText(getValue("extendedKeyCode", s)); 
     } 

     private String getValue(String key, String line) { 
      int sPos = line.indexOf(key); 
      if (sPos >= 0) { 
       int nPos = sPos + key.length() + 1; 
       int ePos = line.indexOf(",", nPos); 
       if (ePos < 0) { 
        ePos = line.indexOf("]", nPos); 
       } 
       if (ePos >= 0) { 
        return line.substring(nPos, ePos); 
       } 
      } 

      return ""; 
     } 

    } 

    public class KeyPressedListener extends KeyAdapter { 

     private KeySpy keySpyFrame; 

     public KeyPressedListener(KeySpy keySpyFrame) { 
      this.keySpyFrame = keySpyFrame; 
     } 

     @Override 
     public void keyPressed(KeyEvent event) { 
      keySpyFrame.getKeySpyPanel().setKeyPressed(event); 
     } 
    } 

} 
-2

Można to osiągnąć z https://github.com/kwhat/jnativehook i potem szpiegować na klawiszach. W my question Pisałem kilka przykładowych metod:

public static void MediaKeyForward(){ 
    GlobalScreen.postNativeEvent(new NativeKeyEvent(2401,0,176,57369,org.jnativehook.keyboard.NativeKeyEvent.CHAR_UNDEFINED)); 

} 
public static void MediaKeyBack(){ 
    GlobalScreen.postNativeEvent(new NativeKeyEvent(2401,0,177,57360,org.jnativehook.keyboard.NativeKeyEvent.CHAR_UNDEFINED)); 

} 
public static void MediaKeyPause(){ 
GlobalScreen.postNativeEvent(new NativeKeyEvent(2401,0,179,57378,org.jnativehook.keyboard.NativeKeyEvent.CHAR_UNDEFINED)); 

} 

Wszystko zrobić, to dołączyć bibliotekę do projektu. Próbka podglądu kluczy i uzyskanie niezbędnych parametrów do utworzenia zdarzenia kluczowego można znaleźć pod adresem here.

Powiązane problemy