JavaFx 建立快捷方式图标及设定开机运行

全文详细地址:JavaFx 建立快捷方式图标及设定开机运行 | Stars-One的产品小屋子

本来是想全部桌面上驱动器,必须在Windows服务平台上完成开机运行,但我的手机软件全是jar文件,并不是传统式的exe文件,也不知道能否设定开机运行,略微收集了材料科学研究了会,发觉有构思,并且能够取得成功完成

文中只科学研究了怎样在windows开展,不清楚macos和linux的状况,诸位有实际的完成构思热烈欢迎共享出去

简易表明

windows怎样完成开机运行的?

在Windows系统软件中,设定手机软件开机运行并并不是很难的事儿,大部分java工具手机软件全是有给予开机运行的选择项

那手机软件沒有体用选择项,就不可以设定为开机运行了?回答自然是否认的

见到互联网的实例教程,都说要去设定每日任务计时器,实际上有一种更加便捷的作法,便是将手机软件或是快捷方式图标放到windows特定的文件夹名称就可以

文件路径文件格式以下:C:\Users\starsone\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,这一文件夹名称姑且称之为启动文件夹

留意:如果你是将手机软件放到这一文件夹名称要想完成开机运行,必须确保你的手机软件是精简版,因此 更加强烈推荐应用快捷方式图标的方法开展设定开机运行

完成构思

可是,一开始我不会明确jar文件是不是也可以立即被windows运行,因此就是拿了以前蓝奏云网盘快速下载做为检测,因为我它是单文件,所以我立即把jar包放到启动文件夹,检测是能够的

因此 ,要想完成jar文件自动启动,构思便是给jar文件建立一个快捷方式图标,随后将此快捷方式图标挪动到启动文件夹就可以完成

难题取决于怎么使用java给文件创建快捷方式图标?

在网上的材料十分少,有一个方式 还必须应用dll文档,因为我不明白window开发设计,因此便放弃了

随后找的全过程中,发觉了有一位巨头根据访问 微软官网文本文档,立即根据字节流方法完成建立了快捷方式图标,并且编码以及简易,因此略微参照了他的源代码,更新改造了个java工具,用于完成建立快捷方式图标及开机运行

充分考虑本来的Java客户,java工具编码填补了Java版本号的,用Java同学们能够立即复制一份,立即应用,如果是Kotlin的,二份都可以应用

调侃下Java版写的有点儿繁杂,有一些API也没有(如获得没有后缀名的文件夹名称),Kotlin中立即有相匹配方式 ,不用自身去解决完成...

Kotlin版

注:本java工具已集成化在我的开源软件里了Stars-One/common-controls: TornadoFx的常见控制 controls for tornadofx

建立快捷方式图标应用

val lnkFile = File("D:\\project\\javafx\\lanzou-downloader\\out\\蓝奏云网盘快速下载器3.2.lnk")
val targetFile = File("D:\\project\\javafx\\lanzou-downloader\\out\\蓝奏云网盘快速下载器3.2.jar")

ShortCutUtils.createShortCut(lnkFile,targetFile)

以上编码是将lnk文件輸出在了平级文件目录,大家到文件夹名称中查询,能够发觉早已转化成成功了,点一下也是能一切正常开启

设定某手机软件开机运行

val targetFile = File("D:\\project\\javafx\\lanzou-downloader\\out\\蓝奏云网盘快速下载器3.2.jar")

ShortCutUtils.setAppStartup(targetFile)

这儿能够见到,转化成的快捷方式图标早已存有于启动文件夹,那样下一次启动的情况下便会自动启动手机软件了

源代码

class ShortCutUtils{
    companion object{
        /**
         * 建立快捷方式图标
         *
         * @param lnkFile 便捷文档
         * @param targetFile 源代码
         */
        fun createShortCut(lnkFile: File, targetFile: File) {
            if (!System.getProperties().getProperty("os.name").toUpperCase().contains("WINDOWS")) {
                println("当今系统软件并不是window系统软件,没法建立快捷方式图标!!")
                return
            }
            val targetPath = targetFile.path
            if (!lnkFile.parentFile.exists()) {
                lnkFile.mkdirs()
            }
            //原快捷方式图标存有,则删掉
            if (lnkFile.exists()) {
                lnkFile.delete()
            }

            lnkFile.appendBytes(headFile)
            lnkFile.appendBytes(fileAttributes)
            lnkFile.appendBytes(fixedValueOne)
            lnkFile.appendBytes(targetPath.toCharArray()[0].toString().toByteArray())
            lnkFile.appendBytes(fixedValueTwo)
            lnkFile.appendBytes(targetPath.substring(3).toByteArray(charset("gbk")))
        }

        /**
         * 设定手机软件开机运行
         *
         * @param targetFile 源代码 
         */
        fun setAppStartup(targetFile: File) {
            val lnkFile = File(targetFile.parentFile, "temp.lnk")
            createShortCut(lnkFile, targetFile)
            val startUpFile = File(startup, "${targetFile.nameWithoutExtension}.lnk")
            //拷贝到启动文件夹,若快捷方式图标已存有则遮盖原先的
            lnkFile.copyTo(startUpFile, true)
            //删掉缓存文件的快捷方式图标
            lnkFile.delete()
        }

        /**      * 设定手机软件开机运行
         *
         * @param targetFile 源代码途径
         */
        fun setAppStartup(targetFilePath: String) {
            setAppStartup(File(targetFilePath))
        }

        /**
         * 建立快捷方式图标
         *
         * @param lnkFilePath 快捷方式图标文档转化成途径
         * @param targetFilePath 源代码途径
         */
        fun createShortCut(lnkFilePath: String, targetFilePath: String) {
            createShortCut(File(lnkFilePath),File(targetFilePath))
        }
        /**
         * 开机运行文件目录
         */
        val startup =  "${System.getProperty("user.home")}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\"

        /**
         * 桌面上文件目录
         */
         val desktop = FileSystemView.getFileSystemView().homeDirectory.absolutePath   "\\"

        /**
         * 文件头,固定不动字段名
         */
        private val headFile = byteArrayOf(
            c04c, 0x00, 0x00, 0x00, 0x01, c014, c002, 0x00, 0x00, 0x00, 0x00, 0x00,
            c0c0.toByte(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, c046
        )

        /**
         * 文件头特性
         */
        private val fileAttributes = byteArrayOf(
            c093.toByte(), 0x00, c008, 0x00,  //可选文件名后缀
            c020, 0x00, 0x00, 0x00,  //总体目标文件名后缀
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  //文件创建時间
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  //文档修改时间
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  //文档最后一次浏览時间
            0x00, 0x00, 0x00, 0x00,  //文档长短
            0x00, 0x00, 0x00, 0x00,  //自定义图标数量
            0x01, 0x00, 0x00, 0x00,  //开启时对话框情况
            0x00, 0x00, 0x00, 0x00,  //快捷键
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 //不明
        )

        private val fixedValueOne = byteArrayOf(
            c083.toByte(), 0x00, c014, 0x00, c01F, c050, c0E0.toByte(), c04F, c0D0.toByte(),
            c020, c0EA.toByte(), c02A, c069, c010, c0A2.toByte(),
            c0D8.toByte(), c008, 0x00, c02B, c030, c030, c09D.toByte(), c019, 0x00, c02f
        )

        /**
         * 固定不动字段名2
         */
        private val fixedValueTwo = byteArrayOf(
            c02A, c04C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, c054, 0x00,
            c032, 0x00, c004, 0x00, 0x00, 0x00, c067, c050, c091.toByte(), c03C, c020, 0x00
        )


    }

}

Java版

建立快捷方式图标应用

File lnkFile = new File("D:\\project\\javafx\\lanzou-downloader\\out\\蓝奏云网盘快速下载器3.2.lnk");
File targetFile = new File("D:\\project\\javafx\\lanzou-downloader\\out\\蓝奏云网盘快速下载器3.2.jar");

//建立快捷方式图标(能够传File目标或是是途径)
ShortCutUtil.createShortCut(lnkFile,targetFile);

以上编码是将lnk文件輸出在了平级文件目录,大家到文件夹名称中查询,能够发觉早已转化成成功了,点一下也是能一切正常开启

设定某手机软件开机运行

File targetFile = new File("D:\\project\\javafx\\lanzou-downloader\\out\\蓝奏云网盘快速下载器3.2.jar");

//设定开机运行(能够是File目标或是是途径)
ShortCutUtil.createShortCut(targetFile);

这儿能够见到,转化成的快捷方式图标早已存有于启动文件夹,那样下一次启动的情况下便会自动启动手机软件了

源代码

package site.starsone;


import javax.swing.filechooser.FileSystemView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

/**
 * @author StarsOne
 * @url <a href="http://stars-one.site">http://stars-one.site</a>
 * @date Create in  2021/06/11 21:28
 */
public class ShortCutUtil { ;
    /**
     * 开机运行文件目录
     */
    public final static String startup=System.getProperty("user.home") 
            "\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\";
    /**
     * 桌面上文件目录
     */
    public final static String desktop= FileSystemView.getFileSystemView().getHomeDirectory().getAbsolutePath() "\\";
    /**
     * 文件头,固定不动字段名
     */
    private static byte[] headFile={c04c,0x00,0x00,0x00,
            0x01, c014,c002,0x00,0x00,0x00,0x00,0x00,
            (byte) c0c0,0x00,0x00,0x00,0x00,0x00,0x00,c046
    };
    /**
     * 文件头特性
     */
    private static byte[] fileAttributes={(byte) c093,0x00,c008,0x00,//可选文件名后缀
            c020, 0x00, 0x00, 0x00,//总体目标文件名后缀
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//文件创建時间
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//文档修改时间
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//文档最后一次浏览時间
            0x00,0x00,0x00,0x00,//文档长短
            0x00,0x00,0x00,0x00,//自定义图标数量
            0x01,0x00,0x00,0x00,//开启时对话框情况
            0x00,0x00,0x00,0x00,//快捷键
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00//不明
    };
    /**
     * 固定不动字段名1
     */
    static byte[] fixedValueOne={
            (byte) c083 ,0x00 ,c014 ,0x00
            ,c01F ,c050 ,(byte)c0E0 ,c04F
            ,(byte)c0D0 ,c020 ,(byte)c0EA
            ,c02A ,c069 ,c010 ,(byte)c0A2
            ,(byte)c0D8 ,c008 ,0x00 ,c02B
            ,c030,c030,(byte)c09D,c019,0x00,c02f
    };
    /**
     * 固定不动字段名2
     */
    static byte[] fixedValueTwo={
            c02A ,c04C ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
            ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00
            ,0x00 ,c054 ,0x00 ,c032 ,0x00 ,c004
            ,0x00 ,0x00 ,0x00 ,c067 ,c050 ,(byte)c091 ,c03C ,c020 ,0x00
    };

    /**
     * 转化成快捷方式图标
     * @param start 详细的文件路径
     * @param target 详细的快捷方式图标途径
     */
    private static void start(String start,String target){
        FileOutputStream fos= null;
        try {
            fos = new FileOutputStream(createDirectory(start));
            fos.write(headFile);
            fos.write(fileAttributes);
            fos.write(fixedValueOne);
            fos.write((target.toCharArray()[0] "").getBytes());
            fos.write(fixedValueTwo);
            fos.write(target.substring(3).getBytes("gbk"));
            fos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(fos!=null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 处理父途径难题
     */
    private static File createDirectory(String file){
        File f=new File(file);
        //获得父途径
        File fileParent = f.getParentFile();
        //假如文件夹名称不会有
        if (fileParent!=null&&!fileParent.exists()) {
            //创建文件夹
            fileParent.mkdirs();
        }
        if (f.exists()) {
            f.delete();
        }
        return f;
    }

    /**
     * 拷贝文档
     * @param source
     * @param dest
     * @throws IOException
     */
    private static void copyFileUsingFileChannels(File source, File dest) throws IOException {
        FileChannel inputChannel = null;
        FileChannel outputChannel = null;
        try {
            inputChannel = new FileInputStream(source).getChannel();
            outputChannel = new FileOutputStream(dest).getChannel();
            outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
        } finally {
            inputChannel.close();
            outputChannel.close();
        }
    }

    /**
     * 建立快捷方式图标
     * @param lnkFilePath 快捷方式图标文件路径
     * @param targetFilePath 快捷方式图标相匹配源代码的文件路径
     */
    public static void createShortCut(String lnkFilePath,String targetFilePath) {
        if (!System.getProperties().getProperty("os.name").toUpperCase().contains("WINDOWS")) {
            System.out.println("当今系统软件并不是window系统软件,没法建立快捷方式图标!!");
            return;
        }
        start(lnkFilePath,targetFilePath);
    }

    /**
     * 转化成快捷方式图标
     * @param lnkFile 快捷方式图标文档
     * @param targetFile 快捷方式图标相匹配源代码
     */
    public static void createShortCut(File lnkFile,File targetFile) {
    if (!System.getProperties().getProperty("os.name").toUpperCase().contains("WINDOWS")) {
            System.out.println("当今系统软件并不是window系统软件,没法建立快捷方式图标!!");
            return;
        }
        start(lnkFile.getPath(),targetFile.getPath());
    }

    /**
     * 设定某手机软件打开运行
     * @param targetFile 源代码
     * @return 是不是设定取得成功
     */
    public static boolean setAppStartup(File targetFile) {

        File lnkFile = new File(targetFile.getParent(),"temp.lnk");
        createShortCut(lnkFile,targetFile);
        try {
            //将手机软件拷贝到手机软件想
            copyFileUsingFileChannels(lnkFile, new File(startup,lnkFile.getName()));
            return true;
        } catch (IOException e) {
            System.out.println("挪动到startup文件夹不成功");
            return false;
        }
    }

    /**
     * 设定某手机软件打开运行
     * @param targetFilePath 源代码途径
     * @return 是不是设定取得成功
     */
    public static boolean setAppStartup(String targetFilePath) {
        File targetFile = new File(targetFilePath);
        return setAppStartup(targetFile);
    }
}

参照

  • Java转化成桌面上快捷方式图标(字节流转化成)_贺驰宇的blog-CSDNblog_java转化成桌面上快捷方式图标

评论(0条)

刀客源码 游客评论