java.awt.Trayicon не отображается, когда приложение java установлено как служба Windows 7 - PullRequest
2 голосов
/ 24 января 2012

Я установил свое приложение Java в качестве службы Windows в ОС Windows 7 (32-разрядная версия). Ожидается, что мое приложение будет показывать java.awt.TrayIcon в области уведомлений при запуске службы. Но это не показ значка. Это же приложение отлично работает на Windows XP. У кого-нибудь есть идеи по этому поводу?

Ответы [ 2 ]

1 голос
/ 24 января 2012

Сервис на окнах не является графическим. Потому что он работает без регистрации пользователя. Если вы хотите иметь иконку в трее и графическое окно для управления вашим сервисом, вам нужно написать другую программу, которая будет взаимодействовать с вашим сервисом (локальная сеть, 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) и надеяться, что он будет отображаться в текущем сеансе ...:)

0 голосов
/ 24 января 2012

Microsoft изменила работу интерактивных сервисов еще в 2006 году. Благодаря «изоляции сеанса 0» то, что работало в Windows NT, XP и Server 2003, больше не работает в Vista, 7 или Server 2008.

Подробнее читайте здесь:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...