explorer.exe崩溃后如何重新添加图标到系统托盘

问题描述 投票:0回答:3

我的java应用程序当前在系统托盘中有一个图标。然而,当系统托盘崩溃时(您可以通过杀死任务栏中的explorer.exe来模拟这种情况),系统托盘返回后图标就会消失。

当我检查 SystemTray.getSystemTray().getTrayIcons() 中系统托盘中的图标时,它总是显示我的 TrayIcon 仍在系统托盘中,即使在它崩溃并重新加载之后并且我的托盘图标更长了。

目前,我每 15 秒左右删除和添加一次图标,但是有没有其他方法可以实现此操作,以便它不会不断消失和出现并烦扰用户?

java crash systray
3个回答
2
投票

只是猜测。

每隔几秒检查一次explorer.exe的pid。如果已更改,请注销您的托盘图标并重新注册。


0
投票

以防万一其他人偶然发现这个问题并想知道发生了什么,最后我不得不在几秒钟后坚持删除和添加图标,因为 Windows 不会更新托盘图标状态的 JVM...自然不是最好的解决办法,但似乎也没有更好的办法了。


0
投票

这就是我修复它的方法。这是第一个答案的扩展。我会更详细地介绍一下。

我有一个正在运行的线程,它每 10 秒检查一次资源管理器的 pid(进程 ID)。如果进程 ID 发生变化,则会调用一个新方法来处理已消失的旧图标并添加一个新图标。

private volatile boolean isRunning = true; 

public void startExplorerWatcherThread() {
    checkTrayIconThread = new Thread(){
        @Override
        public void run() {
            int prevProcessId = 0;
            int currProcessId = 0;
            while(isRunning) {
                try {
                    //Get the current process id from another method 
                    currProcessId = explorerPid();
                   // Set initial process ID
                    if ( prevProcessId == 0 ) {
                        prevProcessId = currProcessId;
                    }
                    //thread sleeps for 10 sec and then checks again
                    Thread.sleep( 10000 );
                } catch ( InterruptedException e ) {
                    System.out.println(e.toString());
                } catch ( IOException e ) {
                    System.out.println(e.toString());
                }
                
                
                //Check if the process id has changed or not
                if ( prevProcessId != currProcessId ) {
                    prevProcessId = currProcessId;
                    // call to the method that disposes the old icon and creates a new one and registers it
                    createNewTrayIcon();
                } else {
                    System.out.println("Windows Explorer stable.");
                }
            }
        }
    };
    //Start the thread
    checkTrayIconThread.start();
}
© www.soinside.com 2019 - 2024. All rights reserved.