当java应用程序作为windows 7服务安装时,java.awt.Trayicon不显示

当java应用程序作为windows 7服务安装时,java.awt.Trayicon不显示,java,windows-7,windows-services,trayicon,Java,Windows 7,Windows Services,Trayicon,我已将Java应用程序作为windows服务安装在windows 7(32位)操作系统上。当服务启动时,我的应用程序将在通知区域显示java.awt.TrayIcon。但它没有显示图标。同样的应用程序在Windows XP上运行良好。 有人知道吗 windows上的服务不是图形化的。因为它运行时没有任何用户登录。 如果您希望有一个托盘图标和一个图形窗口来管理您的服务,您必须编写另一个与您的服务通信的程序(本地网络、dcom等),并将此程序添加到会话启动中。 (就是这样,我在自己的计算机上完成了自

我已将Java应用程序作为windows服务安装在windows 7(32位)操作系统上。当服务启动时,我的应用程序将在通知区域显示java.awt.TrayIcon。但它没有显示图标。同样的应用程序在Windows XP上运行良好。
有人知道吗

windows上的服务不是图形化的。因为它运行时没有任何用户登录。 如果您希望有一个托盘图标和一个图形窗口来管理您的服务,您必须编写另一个与您的服务通信的程序(本地网络、dcom等),并将此程序添加到会话启动中。 (就是这样,我在自己的计算机上完成了自己的java服务)


好的,我在WindowsServer2003下工作过。可能自windows 2003以来,服务无法拥有GUI

你必须开发的代码取决于你想要什么?只需要一个trayicon来监控te服务进程是否仍在运行?单击systray?时显示参数窗口

我为您提供了一个简单的代码(无需异常管理来澄清代码),用于监视服务是否仍在运行和响应(这是一个标准java代码,不需要特殊的库):

systray计划:

//if any Exception --> ERROR CODE
Socket socket = new Socket("localhost", 25146);
DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream());
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
    outToServer.writeBytes("ping\n");
    //Wait maximum 5s to have an answer from the service
    for (int i = 0; inFromUser.ready() == false && i < 5; ++i) {
        Thread.sleep(1000);
    }
    if (inFromUser.ready() == false) {
        //ERROR CODE (change systrat icon, display balloon tooltip,...)
    } else {
        pong = inFromUser.readLine();
        //Check the answer
    }   

    //Check only every second (don't flood yout computer ;))
    Thread.sleep(1000);
}
inFromUser.close();
outToServer.close();
socket.close();

如果要弹出参数窗口,可以尝试在systray程序中编写GUI,将结果写入参数文件,并向服务发送特殊关键字以重新加载参数文件。。。或者直接将GUI写入您的服务,发送一个特殊关键字,然后执行jframe.setVisible(true)并希望它在当前会话中显示…:)

微软早在2006年就改变了交互服务的工作方式。由于“会话0隔离”,在Windows NT、XP和Server 2003中有效的功能在Vista、7或Server 2008中不再有效

请在此处阅读更多信息:


您是否在服务属性的“登录”面板中设置了“允许服务与桌面交互”标志?是的,我已设置了“允许服务与桌面交互”标志。谢谢您的回复。在Windows XP上运行的相同应用程序没有任何问题。这是Windows7特有的问题吗?你能提供更多关于你的解决方案的信息吗?如果可能的话,使用一些代码。
ServerSocket socket = new ServerSocket(this._port);
while (true) {
    Socket connection = socket.accept();
    Thread thread = new Thread(new Runnable {
        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        DataOutputStream outToClient = new DataOutputStream(connection.getOutputStream());
        Scanner scanner = new Scanner(inFromClient);
        while (scanner.hasNextLine()) {
            outToClient.writeBytes(scanner.nextLine());     
        }
        inFromClient.close();
        outToClient.close();
        connection.close();     
    });
    thread.start();
}