Java作为Windows服务与交互式桌面支持和读取currenlogin用户

我有一个Java程序,像一个Windows服务包装与Apache Common Deamon(prunsrv),但我有2个问题:
1.使用交互式桌面configuration的服务可以看到摇摆对话框并从应用程序中尝试图标。 但是,idalogs和try图标不会出现。
2.如何交互式桌面只能与本地系统帐户一起使用,应用程序不能读取当前login的用户,这个用户名对于应用程序是必需的

然后我需要解决这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(); } } 

感谢您的帮助。

Solutions Collecting From Web of "Java作为Windows服务与交互式桌面支持和读取currenlogin用户"

默认情况下,Windows出于安全原因不允许服务与桌面进行交互。 您必须创建两个进程:一个用于唯一的服务部分(作为服务运行,不进行任何交互),另一个进程作为Windows应用程序标准运行。 并建立他们之间的沟通。

从我的问题可以理解,第二个问题可能是由您的代码覆盖从一个静态的System.properties调用接收到的用户名字符串,看到这里:

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

至于你的其他问题,我会看你使用的包装。 我确定有一些API。 (我还没有玩过服务…)。