Windows 11 24H2更新导致Java TrayIcon鼠标按键识别异常
Windows 11 24H2下Java TrayIcon鼠标中键识别异常问题
问题描述
在Windows 11 24H2(内部版本26100.1876)环境中,运行Java系统托盘图标代码时,点击鼠标中键会触发左键逻辑(打印Left button clicked),但预期应触发中键逻辑(打印Middle button clicked)。该问题仅出现在Windows 11 24H2版本,Windows 11 23H2中运行正常,且相同逻辑的Python实现无此异常。
原问题代码
import java.awt.*; import java.awt.event.*; public class TrayIconExample { public static void main(String[] args) { if (SystemTray.isSupported()) { SystemTray tray = SystemTray.getSystemTray(); Image image = Toolkit.getDefaultToolkit().createImage("icon.png"); TrayIcon trayIcon = new TrayIcon(image, "Tray Demo"); trayIcon.setImageAutoSize(true); trayIcon.setToolTip("Tray Icon Demo"); trayIcon.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { System.out.println("Left button clicked"); } else if (e.getButton() == MouseEvent.BUTTON3) { System.out.println("Right button clicked"); } else if (e.getButton() == MouseEvent.BUTTON2) { System.out.println("Middle button clicked"); } } }); try { tray.add(trayIcon); } catch (AWTException e) { System.err.println("TrayIcon could not be added."); } } else { System.err.println("System tray not supported!"); } } }
问题原因
Windows 11 24H2更新后,系统对托盘图标鼠标事件的传递逻辑发生变更,导致AWT的MouseEvent.getButton()方法无法正确解析中键事件,将原本的中键标识错误映射为左键标识。
临时解决方案
改用MouseEvent.getModifiersEx()方法判断按键状态,该方法通过扩展修饰符掩码识别按键,受系统事件映射变化的影响更小。修改后的鼠标监听代码如下:
trayIcon.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0) { System.out.println("Left button clicked"); } else if ((e.getModifiersEx() & MouseEvent.BUTTON3_DOWN_MASK) != 0) { System.out.println("Right button clicked"); } else if ((e.getModifiersEx() & MouseEvent.BUTTON2_DOWN_MASK) != 0) { System.out.println("Middle button clicked"); } } });
通过位运算判断对应按键的掩码是否存在,可准确识别鼠标中键点击事件,规避系统版本带来的事件映射问题。
内容的提问来源于stack exchange,提问作者sblantipodi
相关产品推荐
相关产品推荐

