【问题标题】:Get key combinations获取组合键
【发布时间】:2012-12-27 10:17:40
【问题描述】:

我怎样才能得到键盘上的组合键 E.G. (Ctrl+somekey, Alt+somekey) 使用 Java 吗?

我对键盘上的所有键都使用KeyEvent 侦听器、MouseEvent 侦听器。我可以使用该侦听器捕获键盘上的所有键事件。但是,我无法捕捉到组合键,例如 (Ctrl+Alt+Del)....等。

【问题讨论】:

  • 也许这个stackoverflow.com/questions/7851505/… 回答了你的一些问题?顺便说一句,用户应用程序无法捕获 Windows 上的 Ctrl + Alt + Del 等特殊操作系统组合键,因为操作系统会在应用程序获得机会之前捕获它们。这就是为什么 VNC 客户端和此类程序通常具有将 Ctrl+Alt+Del 发送到主机的菜单选项。

标签: java linux awt keyevent vnc-viewer


【解决方案1】:
public void keyPressed(KeyEvent kevt) {
 if(kevt.getKeyChar()=='c') {
  if(kevt.isAltDown())
  //Code if Alt+c pressed
  if(kevt.isControlDown())
  //Code if Ctrl+c pressed
  if(kevt.isShiftDown())
  //Code if Shift+c pressed
  if(kevt.isAltDown()&&kevt.isControlDown()&&(!kevt.isShiftDown()))
  //Code if Alt+Ctrl+c pressed
  if(kevt.isAltDown()&&kevt.isShiftDown()&&(!kevt.isControlDown()))
  //Code if Alt+Shift+c pressed
  if(!(kevt.isAltDown())&&kevt.isControlDown()&&(kevt.isShiftDown()))
  //Code if Shift+Ctrl+c pressed
  if(kevt.isAltDown()&&kevt.isControlDown()&&kevt.isShiftDown())
  //Code if Alt+Ctrl+Shift+c pressed
}

使用上面的代码,使用任意字符 如果要检查是否按下了 Alt+C+E,请执行以下操作

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

public class Sample implements KeyListener {
  private JTextField lbl=new JLabel("Hello");
  private JPanel pnl=new JPanel(new BorderLayout());
  private JFrame frm=new JFrame ("Sample");
  int []arr;int i=0;

  public Sample() {
    pnl.add("North", lbl);
    frm.setContentPane(pnl);
    frm.pack();
    frm.setVisible(true);
    lbl.addKeyListener(this);
    arr= new int[3];

    public void keyPressed(KeyEvent key) {
       arr[i]=key.getKeyCode();
       i++;
       if((arr[0]==VK_ALT||arr[1]==VK_ALT||arr[2]==VK_ALT)&&   (arr[0]==VK_C||arr[1]==VK_C||arr[2]==VK_C)&&(arr[0]==VK_E||arr[1]==VK_E||arr[2]==VK_E)) {
        //Code you want
       }
     }

     public void keyReleased(KeyEvent evt) {
       arr[i]=null;
     }

     public void keyTyped(KeyEvent kvt) {
     }
 }

}

【讨论】:

  • 感谢您的回答 govindo。我想要的是整体组合键的意思是 (Ctrl+All keys) (Alt+All keys) 。我不能像那样检查每个键。
  • @Juno 您需要什么来捕获所有内容?你的问题在这里得到解答。
  • @vels4j 是的,我想捕获所有按键事件和所有按键组合事件的图像。所以,我需要了解整体组合键事件
  • @Juno 那么你必须检查所有案例。
  • @Juno 你想知道什么?我真的不明白。
【解决方案2】:

其中许多答案似乎很复杂,只是想我会添加我的解决方案。

我写了一个 KeyBinder 类:

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

public abstract class KeyBinder implements KeyListener
{
    private Hashtable<Integer, Boolean> keyMap;

    private int[] keyCodes;

    public KeyBinder(final int... keyCodes)
    {
        this.keyMap = new Hashtable<>();
        this.keyCodes = keyCodes;
    }

    @Override
    public void keyTyped(final KeyEvent e) { }

    @Override
    public void keyPressed(final KeyEvent e)
    {
        getKeyMap().put(e.getKeyCode(), true);

        if (getKeysDown())
        {
            onKeysDown();
        }
    }

    @Override
    public void keyReleased(final KeyEvent e)
    {
        getKeyMap().put(e.getKeyCode(), false);
    }

    private Hashtable<Integer, Boolean> getKeyMap()
    {
        return this.keyMap;
    }

    public boolean getKeysDown()
    {
        for (final int key : this.keyCodes)
        {
            if (getKeyMap().containsKey(key))
            {
                if (!getKeyMap().get(key))
                {
                    return false;
                }
            } else {
                return false;
            }
        }

        return true;
    }

    public abstract void onKeysDown();
}

然后在我的控制下:

final KeyBinder binder = new KeyBinder(KeyEvent.VK_ALT, KeyEvent.VK_A)
{
    @Override
    public void onKeysDown()
    {
        System.out.println("Alt+A");
    }
};

startButton.addKeyListener(binder);

简单:)

【讨论】:

    【解决方案3】:
    @Override
    public void keyPressed(KeyEvent evt) {
             if (evt.getKeyCode()==KeyEvent.VK_CONTROL) { ctrl  = true; }
        else if (evt.getKeyCode()==KeyEvent.VK_SHIFT)   { shift = true; }
        else if (evt.getKeyCode()==KeyEvent.VK_ALT)     { alt   = true; }
        else {
            keyHit = KeyEvent.getKeyText( evt.getKeyCode() );
            System.out.println("Key Hit is "+keyHit);
        }
    
        processLocalKeyEvent(evt);
    }
    
    @Override
    public void keyReleased(KeyEvent evt) {
    
        if (evt.isControlDown() && keyHit != "") ctrl  = true;
        if (evt.isAltDown()     && keyHit != "") alt   = true;
        if (evt.isShiftDown()   && keyHit != "") shift = true;
    
        if (ctrl)  sb.append("Ctrl");
        if (shift) sb.append("Shift");   
        if (alt)   sb.append("Alt"); 
        if (!ctrl && !shift && !alt) {
            sb.append(keyHit);
        } else {
            sb.append("_"+keyHit);
        }
    
        if (ctrl || shift || alt) {
            Thread thread = new Thread();
            try {
                thread.sleep(300);
                rfbProto.capture();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else if ((ctrl || shift || alt) && keyHit=="") {
            rfbProto.capture();
        } else if ((!ctrl || !shift || !alt) && keyHit!="") {
            rfbProto.capture();
        }
    
        ctrl  = false;
        shift = false;
        alt   = false;
        keyHit = "";
        sb = new StringBuffer();
        processLocalKeyEvent(evt);
    }
    

    【讨论】:

      【解决方案4】:
       private void jTable1KeyReleased(java.awt.event.KeyEvent evt) {                                    
         System.out.println(evt.getKeyCode()); //showing code of released button
      
          if(evt.isControlDown() && evt.getKeyCode()==40) // 40 is code for arrow down
          {
            //if ctrl is pressed and arrow down is released  
              System.out.println("Released " + evt.getKeyCode());
          }
      

      简单版

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 2019-06-06
        • 1970-01-01
        相关资源
        最近更新 更多