请求:

这是Java开发人员在我的语言环境中面临的一个非常普遍的问题。我真的为此困扰了很多天。搜索并尝试了很多,阅读文档。阅读与JavaExe相关的所有stackoverflow问题。请仅在您之前做过类似的事情并且有完整的答案时回复。我将非常感谢社区!

Senario:

我正在使用 JavaExe 在桌面交互式功能中作为系统服务运行应用程序。
确切地说,我有一个应用程序捕获桌面的屏幕截图。我希望它在上以任何用户登录的身份运行(作为管理员),因此没有人可以阻止它。

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

我已经大量搜索并发现JavaExe可以工作(通过观看其示例)

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

问题:

根据我的研究,

  • ,您必须创建一个名为.exe的.properties文件,并在该文件中写入"RunType = 1"
  • 您可以在主类中定义一个静态方法:serviceInit()

  • 我是否需要放置任何类或参考/导入?怎么样?

    编辑:

    我在下面的代码可以将用作独立的 .jar,也可以在javaExe.exe中使用

    现在确实制作了系统服务,并由系统用户运行。但是与桌面不交互。即它不显示任何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"
                };
        }
    }
    

    07-28 12:55