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

时间:2013-05-29 13:59:48

标签: java windows-7 windows-services interactive java-service-wrapper

请求:

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

塞纳里奥:

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

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

我搜索了很多,发现JavaExe有效(通过观察它的例子)

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

问题:

根据我的研究,

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

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

  3. 我是否需要放置任何类或引用/导入?怎么样?

    修改

    我的代码工作独立 .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是可能的吗?

2 个答案:

答案 0 :(得分:2)

你应该在你的情况下:

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"
            };
    }
}

答案 1 :(得分:1)

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

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

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

启动它

你问题的答案?