java.awt.Trayicon не отображается, когда приложение java установлено как служба windows 7
Я установил свое Java-приложение в качестве службы Windows в ОС Windows 7(32-разрядная версия). Мое приложение, как ожидается, покажет java.awt.TrayIcon в области уведомлений при запуске службы. Но это не показ значка. Это же приложение отлично работает на Windows XP. У кого-нибудь есть идеи по этому поводу?
2 ответа
Служба на окнах не является графической. Потому что он работает без регистрации пользователя. Если вы хотите иметь иконку в трее и графическое окно для управления вашим сервисом, вам нужно написать другую программу, которая будет взаимодействовать с вашим сервисом (локальная сеть, dcom,...) и добавить эту программу в запуск сеанса. (Именно так я сделал свой собственный java сервис на своих компьютерах).
Хорошо, я работал под Windows Server 2003. Может быть, сервис не может иметь графический интерфейс с Windows 2003?
Код, который вы должны разработать, зависит от того, что вы хотите? Просто есть трейник, чтобы следить за тем, что сервисный процесс все еще работает? Отображение параметров окна при нажатии на системный?...
Я поместил вам простой код (без исключений для уточнения кода), чтобы следить за тем, что служба все еще работает и отвечает (это стандартный код Java, никакой особой необходимости в lib):
Программа 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();
Код сервисной программы:
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 в вашей программе systray, записать результат в файл параметров и отправить специальное ключевое слово в службу для перезагрузки файлов параметров... или либо написать GUI непосредственно в ваш сервис, отправьте специальное ключевое слово, а затем выполните jframe.setVisible(true) и надеемся, что он будет отображаться в текущем сеансе...:)
Microsoft изменила работу интерактивных сервисов еще в 2006 году. То, что работало в Windows NT, XP и Server 2003, больше не работает в Vista, 7 или Server 2008 благодаря "изоляции сеанса 0".
Узнайте больше здесь: