Java 怎么去掉通知窗口左上角的:java(TM)platform se binary 字样?

请问,Java 通过:TrayIcon.displayMessage 在 Windows 下发送通知时,怎么去掉通知窗口左上角的:java(TM)platform se binary 字样?

【以下回答由 GPT 生成】

我可以帮您解答这个问题。

在Java中,TrayIcon.displayMessage方法是使用操作系统的默认通知实现来显示通知。因此,要去掉通知窗口左上角显示的"java(TM)platform se binary"字样,需要使用一些操作系统特定的封装库来修改通知窗口的样式。

首先,在Windows操作系统下,可以使用JNA(Java Native Access)库来调用操作系统的相关函数。JNA是一个Java库,允许您以Java代码的方式调用本地(C/C++)函数。

下面是一个使用JNA库来修改通知窗口的样式的示例代码:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.BaseTSD;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

public class TrayNotification {
    public interface User32 extends Library {
        User32 INSTANCE = (User32) Native.load("user32", User32.class);

        int WM_GETICON = 0x007F;
        int ICON_SMALL2 = 2;

        int NIM_MODIFY = 0x00000001;

        boolean Shell_NotifyIconW(int dwMessage, NOTIFYICONDATA lpData);

        class NOTIFYICONDATA extends Structure {
            public int cbSize;
            public WinDef.HWND hWnd;
            public int uID;
            public int uFlags;
            public int uCallbackMessage;
            public WinDef.HICON hIcon;
            public char[] szTip = new char[128];
            public int dwState;
            public int dwStateMask;
            public char[] szInfo = new char[256];
            public BaseTSD.ULONG_PTR dwInfoFlags;
            public char[] szInfoTitle = new char[64];
            public BaseTSD.ULONG_PTR dwInfoTitleFlags;
            public char[] szInfoTip = new char[128];
            public BaseTSD.ULONG_PTR dwInfoFlags2;
            public WinDef.HICON hBalloonIcon;

            public NOTIFYICONDATA() {
                this.cbSize = size();
            }

            protected void useMemory(Pointer arg0) {
                super.useMemory(arg0);
                read();
            }
        }
    }

    public static void main(String[] args) {
        // 获取当前进程的窗口句柄
        WinDef.HWND hwnd = User32.INSTANCE.GetForegroundWindow();
        int id = 1; // 假设您的TrayIcon的ID是1

        // 修改通知窗口的样式
        User32.NOTIFYICONDATA notificationData = new User32.NOTIFYICONDATA();
        notificationData.hWnd = hwnd;
        notificationData.uID = id;
        notificationData.uFlags = User32.NIF_MODIFY;
        notificationData.szInfoTitle = "Title without 'java(TM) platform se binary'".toCharArray();

        User32.INSTANCE.Shell_NotifyIconW(User32.NIM_MODIFY, notificationData);
    }
}

上述代码使用了JNA库,通过调用Shell_NotifyIconW函数来修改通知窗口的样式。在代码中,我们首先获取当前进程的窗口句柄,然后创建一个NOTIFYICONDATA结构,将要修改的属性填入结构中,最后调用Shell_NotifyIconW函数传入NIM_MODIFY标志来修改通知窗口的样式。

请注意,上述代码仅适用于Windows操作系统。如果您希望在其他操作系统上运行,请使用操作系统提供的相应方法来修改通知窗口的样式。

希望这可以帮助到您!如果您还有任何问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

是不是没设置标题?试试
trayIcon.displayMessage("你的标题", "你的内容", MessageType.INFO);

在Java使用TrayIcon在Windows下发送通知时,窗口左上角默认会显示"java(TM) platform se binary"字样,如果想去掉,可以通过以下两种方式:

设置TrayIcon的title为空字符串:

trayIcon.displayMessage("", "Notification message", TrayIcon.MessageType.INFO);

使用JNA(Java Native Access)调用Win32 API设置通知标题:

import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;

HWND hwnd = trayIcon.getTrayIconWindowHandle(); 
WinUser.SetWindowText(hwnd, ""); // 设置标题为空

这将直接作用在native窗口上去除标题文本。

另外,也可以通过完全自定义通知窗口来避免这个默认标题,但实现会更复杂一些。

总之,设置空标题或者使用JNA直接设置native窗口标题都可以去掉这个默认的"java(TM) platform se binary"文本。