所以我今天的问题是个人学术学习意愿,尽管这可能有点超出我的水平。请容忍我!
我做了一个简单的应用程序,可能看起来(也可能是)有点笨拙。它所做的只是打开一个窗口,让你按下一个按钮,关闭所述窗口。
以下是这个有问题的构造的代码:
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应用程序如何在每次重新启动时自动启动。
我可以让应用程序在启动文件夹中放一个自己的快捷方式吗?
或者我可以让它在用户运行应用程序后将自己添加到注册表中吗?
我知道我问了很多,但我能做一个这样的演示吗?
你们是我的英雄。
登录时运行(手动)
打包应用程序后,您只需将java -jar your-app.jar
放在Windows启动菜单中的.bat
文件中即可。
如果你不想创建jar
(例如,因为你的应用程序足够简单),并且总是假设你已经配置了Java环境变量(JAVA_HOME
、PATH
……),你可以直接运行你的字节码:
startup.bat
:
cd your/app/bytecode/path
java yourapp
请参阅如何在启动时启动应用程序。
启动时运行(手动)
如果您需要应用程序在用户登录前运行,您可以使用Windows任务调度程序,并在启动时使用触发器,按照以下操作系统答案包装您的应用程序:
@echo off REM Eventually change directory to the program directory cd C:UsersUser1DocumentsNetBeansProjectsFacebookdist REM run the program "C:Program FilesJavajdk1.7.0binjava.exe" -jar "C:UsersUser1DocumentsNetBeansProjectsFacebookdistFacebook.jar"
启动时运行(安装程序)
如果你真的不想要任何用户交互,我认为唯一简单(也是IMHO道德)的解决方案就是安装程序。
您基本上需要一个向导来安装您的应用程序,以便您(和用户)将其配置为在启动时运行。有很多向导,你可以在这里建立自己的向导或开始你的研究。
启动时运行(独立)
使用这里描述的方法,直接在你的小应用程序中写这样的东西(这里的原始帖子):
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("nnUsage: java SetEnv {key} {value}nn");
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命令(请参阅上面关于如何打包jar或在.bat文件中运行.class的方法),例如"C:UsersYourApp.jar"
注意
正如作者所说,这种方法应该适用于任何版本的Windows,因为它们都使用相同的StartupRun
注册表项。不过,请记住,这是不可移植的,您可能需要根据MS OS版本调整脚本。
注2
在直接从应用程序修改注册表代码之前要三思而后行(hacky方法)。要做到这一点,您可能需要每次运行应用程序时都具有主管/管理员权限。此外,在没有正确、明确的用户提示的情况下这样做可能被视为恶意软件/垃圾邮件的恶意行为。
Window启动时有几个选项可以运行应用程序:
-
将应用程序的快捷方式放在启动目录中,请参阅此处。
-
设置一个java服务包装器,以便在Windows启动时启动java应用程序。
-
当Windows启动时,使用Windows中的任务计划程序执行
java -jar yourfile.jar
命令。
在所有这些选项中,启动目录将是最简单的选项,听起来它可以随心所欲。
编辑
按照您在编辑中描述的操作,您可能需要编辑注册表,将您的应用程序添加到启动时启动的应用程序列表中。
看看这里,了解一下如何做到这一点的一些细节。
本质上,您希望在HKCUSoftwareMicrosoftWindowsCurrentVersionRun<YourKeyAsAString>
向注册表添加一个条目,该条目的值作为应用程序的路径。
正如RobF所说,您可以在启动目录中创建一个快捷方式。您还可以创建一个注册表项,请参阅此处。