You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:57:45