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

如何隐藏SWT ToolTip底部显示的Java程序进程名称?

解决SWT ToolTip显示Java进程名称的问题

我之前也碰到过Windows 10更新后这个烦人的问题——系统会自动在SWT原生ToolTip底部加上进程的友好名称,而Java进程默认显示的就是“JAVA (TM) Platform SE Binary”。下面给你几个可行的解决思路:

方案1:将Jar打包成Windows可执行文件(最省心)

如果可以接受把Jar转换成exe,这是最直接的方法。用Launch4j、WinRun4J或者JSmooth这类工具,把你的Jar打包成exe,同时设置自定义的程序名称、图标和描述。这样运行时进程的友好名称就是你设置的程序名,ToolTip底部就会显示这个自定义名称(至少不会是Java的默认标识)。

操作步骤大概是:

  • 下载对应工具,添加你的Jar文件路径
  • 在工具的基础设置页,指定生成的exe输出路径,可选设置程序图标
  • 在版本信息页,设置“文件描述”“产品名称”等信息,这些就是进程的友好名称
  • 点击生成按钮,运行生成的exe,ToolTip底部就会显示你设置的名称了

方案2:用JNA修改Java进程的友好名称(保持Jar运行)

如果不想打包成exe,可以用JNA(Java Native Access)调用Windows API修改进程的显示名称,让Windows识别你的自定义程序名。

步骤:

  1. 添加JNA依赖:如果用Maven,在pom.xml中加入:
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.13.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.13.0</version>
</dependency>

如果是手动管理依赖,下载JNA的核心包和平台包,添加到项目的类路径中即可。

  1. 编写代码修改进程名称:
import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.ptr.IntByReference;

public class ProcessNameChanger {
    public static void setProcessName(String newName) {
        WinNT.HANDLE hProcess = Kernel32.INSTANCE.GetCurrentProcess();
        int size = newName.length() * 2 + 2;
        byte[] nameBytes = newName.getBytes(java.nio.charset.StandardCharsets.UTF_16LE);
        boolean success = Kernel32.INSTANCE.SetProcessInformation(
            hProcess,
            0, // ProcessInformationClass: ProcessNameInfo(适配Windows 10+)
            nameBytes,
            size
        );
        if (!success) {
            int errorCode = Kernel32.INSTANCE.GetLastError();
            System.err.println("修改进程名称失败,错误码: " + errorCode);
        }
    }
}

然后在你的应用启动时调用这个方法:

public static void main(String[] args) {
    ProcessNameChanger.setProcessName("你的程序名称");
    // 初始化SWT应用...
}

注意:这个方法需要Windows 10及以上版本,并且程序需要有足够的权限。修改后,ToolTip底部会显示你设置的程序名称,而非Java的默认标识。

方案3:自定义SWT气泡通知(完全控制显示内容)

如果完全不想让ToolTip底部显示任何额外名称,可以放弃原生的SWT ToolTip,用SWT的Shell来模拟一个气泡通知,这样你可以完全控制显示的内容和样式。

示例代码:

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;

public class CustomToolTipExample {
    public static void showCustomToolTip(Display display, Button parent, String message) {
        Shell tooltipShell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP | SWT.TOOL);
        tooltipShell.setLayout(new FillLayout(SWT.HORIZONTAL));
        
        // 模拟系统ToolTip的黄色背景
        Color bgColor = display.getSystemColor(SWT.COLOR_INFO_BACKGROUND);
        tooltipShell.setBackground(bgColor);
        
        Label label = new Label(tooltipShell, SWT.WRAP);
        label.setText(message);
        label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
        label.setBackground(bgColor);
        
        // 计算气泡大小
        Point textSize = label.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        tooltipShell.setSize(textSize.x + 10, textSize.y + 10);
        
        // 设置气泡在按钮下方显示
        Point parentLocation = parent.toDisplay(0, 0);
        tooltipShell.setLocation(parentLocation.x, parentLocation.y + parent.getSize().y + 5);
        
        tooltipShell.open();
        
        // 设置3秒后自动关闭
        display.timerExec(3000, () -> {
            if (!tooltipShell.isDisposed()) {
                tooltipShell.dispose();
            }
        });
    }

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("自定义ToolTip示例");
        shell.setLayout(new FillLayout());
        
        Button button = new Button(shell, SWT.PUSH);
        button.setText("点击显示自定义气泡");
        button.addListener(SWT.MouseDown, e -> {
            showCustomToolTip(display, button, "这是自定义的气泡通知,没有额外的进程名称!");
        });
        
        shell.setSize(300, 200);
        shell.open();
        
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

这个自定义Shell可以完全模拟原生ToolTip的样式,而且不会有系统附加的进程名称,因为界面完全由你控制。


内容的提问来源于stack exchange,提问作者Teja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:36:06