簡體   English   中英

Java作為Windows服務,具有交互式桌面支持和已讀當前用戶

[英]Java as windows service with interactive desktop support and read curren logged user


我有一個Java程序,其工作方式類似於用apache Common Deamon(prunsrv)包裝的Windows服務,但我有兩個問題:
1.使用交互式桌面對其服務進行配置的服務,可以從應用程序中查看擺動對話框和嘗試圖標。 但是idalogs and try圖標沒有出現。
2.交互式桌面如何僅與本地系統帳戶一起使用,應用程序無法讀取當前登錄的用戶,此用戶名是應用程序所必需的

然后我需要解決這2個問題,謝謝,我從主類粘貼了代碼

package widget;

import java.awt.AWTException;
import java.awt.Image;
import java.awt.Label;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

import widget.controller.NotifyManager;
import widget.utils.Logger;


public class AWidget extends JFrame {
    private static Properties props = null;
    private static String parametersFile = "widget.properties";
    public static String mediaResourcesPath;
    public static String appIcon;
    public static int updateFrecuency = 5;

    String username = "";
    TrayIcon trayIcon;
    SystemTray tray;

    static String activityImages[];

    AWidget() {
        super("Italo Widget");

        mediaResourcesPath = getParameter("mediaResourcesPath");
        appIcon = getParameter("appIcon");

        String val = getParameter("updateFrecuency");

        try {
            updateFrecuency = Integer.parseInt(val);
        } catch (NumberFormatException e) {
            Logger.getTrace().debug("No se pudo leer la frecuencia de actualización de los mensajes");
        }

        updateFrecuency *= 1000;

        username = System.getProperty("user.name");
        username = "Javier";

        System.out.println("creating instance");
        try {
            System.out.println("setting look and feel");
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            System.out.println("Unable to set LookAndFeel");
        }

        JPanel panel = new JPanel();

    panel.add(new Label("Usuario: " + username));

    add(panel);

        Image image = Toolkit.getDefaultToolkit().getImage(mediaResourcesPath + "//" + appIcon);

        if (SystemTray.isSupported()) {
            System.out.println("system tray supported");
            tray = SystemTray.getSystemTray();

            ActionListener exitListener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Exiting....");
                    System.exit(0);
                }
            };
            PopupMenu popup = new PopupMenu();
            MenuItem defaultItem = new MenuItem("Exit");
            defaultItem.addActionListener(exitListener);
            popup.add(defaultItem);
            defaultItem = new MenuItem("Open");
            defaultItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    setVisible(true);
                    setExtendedState(JFrame.NORMAL);
                }
            });
            popup.add(defaultItem);

            trayIcon = new TrayIcon(image, "Tareas Italo", popup);
            trayIcon.setImageAutoSize(true);

        } else {
            System.out.println("System tray not supported");
        }
        addWindowStateListener(new WindowStateListener() {
            public void windowStateChanged(WindowEvent e) {
                if (e.getNewState() == ICONIFIED) {
                    try {
                        tray.add(trayIcon);
                        setVisible(false);
                        System.out.println("added to SystemTray");
                    } catch (AWTException ex) {
                        System.out.println("unable to add to tray");
                    }
                }
                if (e.getNewState() == 7) {
                    try {
                        tray.add(trayIcon);
                        setVisible(false);
                        System.out.println("added to SystemTray");
                    } catch (AWTException ex) {
                        System.out.println("unable to add to system tray");
                    }
                }
                if (e.getNewState() == MAXIMIZED_BOTH) {
                    tray.remove(trayIcon);
                    setVisible(true);
                    System.out.println("Tray icon removed");
                }
                if (e.getNewState() == NORMAL) {
                    tray.remove(trayIcon);
                    setVisible(true);
                    System.out.println("Tray icon removed");
                }
            }
        });
        setIconImage(image);

        try {
            tray.add(trayIcon);
            setVisible(false);
            System.out.println("added to SystemTray");
        } catch (AWTException ex) {
            System.out.println("unable to add to tray");
        }

        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void start(String[] args) {
        File f = new File("");
        f = new File(f.getAbsolutePath() + "/conf/running.conf");
        f.delete();

        Logger.getTrace().debug("Iniciando");
        AWidget italoW = new AWidget();
        System.out.println("Instancia");

        new NotifyManager(italoW);
    }
    public static void stop(String[] args) {
        try {
            File f = new File("");
            f = new File(f.getAbsolutePath() + "/conf/running.conf");
            FileWriter fw = new FileWriter(f);
            fw.append("false");
            fw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            if(args != null && args.length >0) {
                if("stop".equals(args[0])) {
                    File f = new File("");
                    f = new File(f.getAbsolutePath() + "/conf/running.conf");
                    FileWriter fw = new FileWriter(f);
                    fw.append("false");
                    fw.close();

                } else {
                    File f = new File("");
                    f = new File(f.getAbsolutePath() + "/conf/running.conf");
                    f.delete();
                }
            }
            Logger.getTrace().debug("Iniciando");
            AWidget italoW = new AWidget();
            System.out.println("Instancia");

            new NotifyManager(italoW);

        } catch(Throwable th) {
            Logger.getTrace().debug("ERROR:::" + th.getMessage());
        }           
    }

    public void finish(){
        tray.remove(trayIcon);
        dispose();
    }       
}

感謝您的幫助。

默認情況下,出於安全原因,Windows不允許服務與桌面進行交互。 您必須創建兩個進程:一個用於唯一的服務部分(作為服務運行,沒有任何交互),另一個用於Windows應用程序標准運行。 並在他們之間建立溝通。

從我的問題中可以理解,第二個問題可能是代碼覆蓋了從System.properties調用中接收到的用戶名String(帶有靜態代碼)引起的,如下所示:

 username = System.getProperty("user.name"); username = "Javier"; //remove me 

至於您的其他問題,我將查看您使用的包裝器。 我確定有某種API。 (我還沒有玩過服務……)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM