Windows-Left and Windows-Right support in undecorated JFrames

I am using unecorated JFrame with custom title bar and custom resizer. Everything works fine, but when I make JFrame undecorated, I lose support for Windows-Left / Right key bindings (it seems to be built into Windows). I want to override this function for my application. My problem: I can detect in the key listening whether the Windows key is pressed, but I cannot determine if another key is pressed (left / right in my case) along with the Windows key (without the WINDOWS_MASK_DOWN modifier in InputEvent). Does anyone know a workaround?

Here is my code:

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); } } 
+5
source share
1 answer

Well, I couldn’t check it correctly, as on my system, Windows + Left or Right were intercepted and processed by Windows even for unordered frames, however, adding another case for an unused combination of Windows + A proved that the following code works if the host system doesn't use a key shortcut:

(Update: since this is apparently the key press that Windows consumes, you can select the Windows key + Left or Right )

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

It seems that the normal key listener on the component does not work, because the component loses focus when Windows is pressed.

+1
source

Source: https://habr.com/ru/post/1204117/


All Articles