gpt4 book ai didi

Java 作为具有交互式桌面支持和读取当前登录用户的 Windows 服务

转载 作者:可可西里 更新时间:2023-11-01 11:08:54 25 4
gpt4 key购买 nike


我有一个 java 程序,它的工作方式类似于使用 apache Common Deamon (prunsrv) 包装的 Windows 服务,但我有 2 个问题:
1. 该服务配置了交互式桌面,可以从应用程序中看到 Swing 对话框和尝试图标。但是 idalogs 和 try 图标没有出现。
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 应用程序标准运行。并在它们之间建立通信。

关于Java 作为具有交互式桌面支持和读取当前登录用户的 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com