2

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

4

2 回答 2

1

Windows 上的服务不是图形化的。因为它在没有任何用户登录的情况下运行。如果你想要一个托盘图标和一个图形窗口来管理你的服务,你必须编写另一个与你的服务通信的程序(本地网络、dcom、...)并将这个程序添加到会话启动中。(就是这样我在我的电脑上完成了我自己的java服务)。


好的,我在 Windows server 2003 下工作过。也许从 windows 2003 起服务就不能有 GUI?

您必须开发的代码取决于您想要什么?只是有一个托盘图标来监视该服务进程仍在运行吗?单击系统托盘时显示参数窗口?...

我给你放了一个简单的代码(没有异常管理来澄清代码)来监控服务是否仍在运行和响应(这是一个标准的java代码,不需要特殊的lib):

系统托盘程序:

//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();

服务程序代码:

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();
}

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

于 2012-01-24T11:41:33.923 回答
0

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

在这里阅读更多:

于 2012-01-24T15:05:55.467 回答