JavaExe和Java应用程序作为windows系统服务交互到桌面

请求:

这是我的语言环境中Java开发人员面临的一个非常常见的问题。 我真的被困了很多天。 搜索并尝试了很多,阅读文档。 阅读所有与JavaExe相关的stackoverflow问题。 如果您以前做过类似的事情并且有一个全面的答案,请回复。 我真的很感谢社区!

塞纳里奥:

我正在使用JavaExe在桌面交互function中将应用程序作为系统服务运行。 确切地说,我有一个应用程序, 可以捕获桌面的屏幕截图 。 我想让它在任何用户登录时运行( 作为管理员 ),所以没有人可以阻止它。

我有一个myapp.jar,settings.txt和一个lib目录。

我搜索了很多,发现JavaExe工作(看它的例子)

如果有人有更好的方法。 请说明。

问题:

根据我的研究,

  1. 您必须创建一个名为.exe的.properties文件,并在此文件中写入"RunType = 1"

  2. 你在主类中定义一个静态方法: serviceInit()

我需要放置任何类或引用/导入吗? 怎么样?

编辑:

我下面的代码也可以作为独立的.jar和javaExe.exe使用

它现在确实提供系统服务并由SYSTEM用户运行。 但它不是桌面互动 。 即它没有显示任何GUI。

 package temp; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; public class Temp { /** * @param args the command line arguments */ public static void main(String[] args) { serviceInit(); } public static boolean serviceInit(){ new Thread(){ public void run(){ Integer i = 0; while(i < 999999999){ JOptionPane.showMessageDialog(null,i); i++; } } }.start(); return true; } } 

我不认为将.jar,lib目录和settings.txt捆绑成一个.exe是可能的吗?

你应该在你的情况下:

 public class MyApp_ServiceManagement { static boolean isMsgToDisplay = false; ///////////////////////////// public static boolean serviceInit() { (new Thread() { public void run() { for(int i=0;i < 6;i++) { try { sleep(5*1000); } catch(Exception ex) {} isMsgToDisplay = true; } } }).start(); return true; } /// is Data ready to be send to the UI ? public static boolean serviceIsDataForUI() { return isMsgToDisplay; } /// Data to be send to the UI public static Serializable serviceDataForUI() { isMsgToDisplay = false; return "hello, I am an interactive Service"; } } 

对于UI部分:

 public class MyApp_TaskbarManagement { /// To show (or not) the icon in tray public static boolean taskIsShow() { return false; } /// Receive the message from Service public static void taskDataFromService(Serializable data) { JOptionPane.showMessageDialog(null, data); } /// descr of UI public static String[] taskGetInfo() { return new String[] { "UI part of Service" }; } } 

main()方法永远不会在服务模式下调用(除了一个特殊情况),但如果你想保留你的main()方法,你必须在serviceInit()中调用main()。

将serviceInit()放在主类或名为XXX_ServiceManagement的另一个类中,其中XXX是主类的名称。

然后,serviceInit()必须在30秒延迟之前返回。 不要把无限循环……放在里面。 将您的代码放在一个线程中,并从serviceInit()(或main)启动它

那个答案你的问题?