有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

windows应用程序在使用Java登录时启动

所以我今天的问题是个人学习的学术意愿,尽管这可能有点超出我的水平。请容忍我这件事

我制作了一个简单的应用程序,它看起来(可能)有点笨重。它所做的只是打开一个窗口,然后让你按下一个按钮,来关闭这个窗口

下面是这个可疑结构的代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class StartupLearning extends JFrame implements ActionListener {

private JButton button;

public StartupLearning() {

    super("If you see this box on startup, you've learned something new today!");

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

    button = new JButton("Close this box");
    button.addActionListener(this);
    button.setActionCommand("Close");
    add(button);
    pack();

}

@Override
public void actionPerformed(ActionEvent e) {

    String cmd = e.getActionCommand();

    if (cmd.equals("Close"))
        dispose();
}

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            new StartupLearning().setSize(400, 75);
        }

    });
}
}

我知道它不是完美的,我知道它可能有可以优化和组织的缺陷,但正如前面提到的,这只是我试图教自己一些新的东西

现在,我想知道的是,我可以使用什么代码,以及当用户登录到Windows时,我如何使用这些代码使这个非常简单的应用程序运行(如果它使事情变得更复杂的话,我们不考虑跨平台)

对于像他听起来那么环保的人来说,什么类或代码最适合这份工作,我如何将它与我的代码结合使用

所有需要发生的事情是,这个简单的代码需要在用户登录时运行,并在用户点击按钮时关闭

编辑

感谢你们三位的回答,我显然还不够具体。我需要我的小漂亮的代码在登录时运行,而不需要任何用户输入或移动文件

应用程序需要能够在用户启动一次后立即启动运行

这意味着我将运行该应用程序,从现在起,它将始终在启动时运行,直到我删除该应用程序或在源代码中告诉它不再这样做

EDIT2

你们真是太棒了,能忍受我这么久。进一步澄清:

假设用户是管理员,并且没有密码或正在使用任何形式的保护。没有反病毒、反间谍软件、防火墙或任何东西。没有任何防御措施

假设.jar文件和.class文件都在C:\

假设应用程序将手动运行一次,然后才能开始登录。这是当应用程序有机会将自己添加到注册表或将.bat放在启动文件夹或其他地方时

不要太担心道德问题,因为我只是想确定一个简单的Java应用程序如何在每次重新启动时自动启动

我是否可以让应用程序在启动文件夹中放置自己的快捷方式

或者我可以在用户运行应用程序后将其自身添加到注册表中吗

我知道我的要求很高,但我能演示一下这样的东西吗

你们是我的英雄


共 (3) 个答案

  1. # 1 楼答案

    登录时运行(手动)

    打包应用程序后,您可以将java -jar your-app.jar放入Windows启动菜单中的.bat文件中

    如果你不想创建一个jar(例如,因为你的应用程序足够简单),并且总是假设你已经配置了Java环境变量(JAVA_HOMEPATH),您可以直接运行字节码:

    startup.bat

    cd your/app/bytecode/path
    java yourapp
    

    请参阅here如何在启动时启动应用程序

    启动时运行(手动)

    如果您需要在用户登录之前运行应用程序,您可以使用Windows任务计划程序,并在启动时使用触发器,按照thisOS答案中的描述包装应用程序:

    @echo off
    REM Eventually change directory to the program directory 
    cd C:\Users\User1\Documents\NetBeansProjects\Facebook\dist\
    REM run the program
    "C:\Program Files\Java\jdk1.7.0\bin\java.exe" -jar "C:\Users\User1\Documents\NetBeansProjects\Facebook\dist\Facebook.jar"
    

    启动时运行(安装程序)

    如果你真的不想要任何用户交互,我想唯一简单的解决方案就是安装程序

    基本上,你需要一个向导来安装你的应用程序,让你(和用户)配置它在启动时运行。有很多向导,你可以建立自己的或开始你的研究看看here

    启动时运行(独立)

    使用here描述的方法,直接在小型应用程序中编写类似的内容(原始帖子here):

    static final String REG_ADD_CMD = "cmd /c reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\" /v \"{0}\" /d \"{1}\" /t REG_EXPAND_SZ";
    private void exec(String[] args) throws Exception
    {
        if (args.length != 2)
            throw new IllegalArgumentException("\n\nUsage: java SetEnv {key} {value}\n\n");
    
        String key = args[0];
        String value = args[1];
    
        String cmdLine = MessageFormat.format(REG_ADD_CMD, new Object[] { key, value });
    
        Runtime.getRuntime().exec(cmdLine);
    }
    

    Key是你的应用程序名(不相关),Value是你的jar文件或。运行应用程序的bat命令(请参阅上面关于如何在.bat文件中打包jar或运行.class的方法),例如"C:\Users\YourApp.jar"

    注意

    正如作者所说,这种方法应该适用于任何版本的Windows,因为它们都使用相同的Startup\Run注册表项。不过,请记住,这是不可移植的,您可能需要根据MS OS版本调整脚本

    注2

    在直接从应用程序修改注册表代码之前,要三思而后行(hacky方法)。要做到这一点,您可能需要在应用程序每次运行时都获得主管/管理员权限。此外,在没有正确、明确的用户提示的情况下这样做可能被视为恶意软件/垃圾邮件恶意行为

  2. # 2 楼答案

    正如罗布所说,你可以在启动目录中创建一个快捷方式。还可以创建注册表项,请参见here

  3. # 3 楼答案

    当窗口启动时,有几个选项可以运行应用程序:

    1. 在启动目录see here中放置应用程序的快捷方式

    2. 安装java服务包装器,以便在Windows启动时启动java应用程序

    3. Windows启动时,使用Windows中的任务计划程序执行java -jar yourfile.jar命令

    在所有这些选项中,startup目录是最简单的选项,听起来它可以做你想做的事情

    编辑

    按照编辑中的描述,您可能需要编辑注册表,将应用程序添加到启动时启动的应用程序列表中

    看看here了解一些关于如何做到这一点的细节

    本质上,您希望在HKCU\Software\Microsoft\Windows\CurrentVersion\Run\<YourKeyAsAString>的注册表中添加一个条目,该值作为应用程序的路径