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

标签 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()

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

编辑:

我下面的代码可以作为独立的.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"
            };
    }
}

关于JavaExe 和 Java 应用程序作为 Windows 系统服务与桌面交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815956/

相关文章:

java - 如何禁用 Quartz JDBCJobStore 中的作业?

windows - 内核驱动签名

java - 使用 Tomcat 作为 Windows 服务的原因是什么?

windows-services - 如何以编程方式停止Windows Service?

java - 如何将包含内容的 TreeMap 转换为 JSON 格式 Spring REST Controller JAVA

java - 如何存储具有不同行为的相似对象?

java - 使用 SHA 256 散列并使用 AES 加密

asp.net - Windows 7 上的等效 "aspnet_regiis -lk"是什么?

c# - Windows 7 和 Vista UAC - 在 C# 中以编程方式请求提升

c# - 使用 WCF 的 Windows 服务