在未修饰的JFrame中支持Windows-Left和Windows-Right

Ser*_*kyy 6 java swing keylistener

我使用带有自定义标题栏和自定义缩放器的未修饰的JFrame.一切正常,但是当我制作一个JFrame未修饰时,我失去了对Windows-Left/Right键绑定的支持(似乎它是由Windows本机实现的).我想为我的应用程序重新实现此功能.我的问题:我可以在一个关键监听器中检测到是否按下了Windows键,但我无法检测是否另一个键(在我的情况下为左/右)与Windows键一起按下(在InputEvent中没有修饰符WINDOWS_MASK_DOWN).可能有人知道解决方法吗?

这是我的代码:

import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class HeadlessFrameTest {

    public static void main(String[] args) {
        final JFrame frm = new JFrame("Test");
        final JTextField field = new JTextField();
        frm.add(field, BorderLayout.NORTH);
        field.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println(e);
            }
        });
        frm.setUndecorated(true);
        frm.setSize(500, 550);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }

}
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 1

好吧,我无法\xe2\x80\x99t在我的系统上正确地测试它,Windows+Left或者即使对于未修饰的帧也被Windows拦截和处理,但是为未使用的组合添加另一个案例Right +Windows证明A如果主机系统以下代码可以工作不消耗快捷键:

\n\n

(更新:因为它似乎是Windows消耗的按键事件,所以可以捕获Windows+Left或的按键释放)Right

\n\n
final JFrame frm = new JFrame("Test");\nfinal JTextField field = new JTextField();\nfrm.add(field, BorderLayout.NORTH);\nfrm.getToolkit().addAWTEventListener(new AWTEventListener() {\n    boolean winDown;\n    public void eventDispatched(AWTEvent event) {\n        KeyEvent ev=(KeyEvent)event;\n        final boolean pressed = ev.getID()==KeyEvent.KEY_PRESSED;\n        if(ev.getKeyCode()==KeyEvent.VK_WINDOWS) winDown=pressed;\n        else if(winDown) switch(ev.getKeyCode()) {\n            case KeyEvent.VK_LEFT:\n                System.out.println("windows + LEFT "+(pressed?"pressed":"released"));\n                break;\n            case KeyEvent.VK_RIGHT:\n                System.out.println("windows + RIGHT "+(pressed?"pressed":"released"));\n                break;\n            case KeyEvent.VK_A:\n                System.out.println("windows + A "+(pressed?"pressed":"released"));\n                break;\n        }\n    }\n}, KeyEvent.KEY_EVENT_MASK);\nfrm.setUndecorated(true);\nfrm.setSize(500, 550);\nfrm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);\nfrm.setVisible(true);\n
Run Code Online (Sandbox Code Playgroud)\n\n

组件上的普通按键监听器似乎不起作用,因为Windows按下时组件会失去焦点。

\n