求用java写能在PC上开机自启动的程序。

最近做了一个PC上的小程序,需要开机启动。不要说修改注册表,计划任务之类的方法。这不行,你不能说让用户自己这样去做吧?我想做成像很多软件(例如:腾讯QQ)一样,只需用户点击一下鼠标就可以方便快捷的设置程序是否开机自启动。请问各位高手怎么实现?请给具体代码。非常感谢!

具体代码是不会给了,因为是在项目中用的,涉及到保密,而且也不会直接就能应用到你的程序中。说一下思路吧,希望对你有帮助:
1)可以把程序做成Windows的服务,然后可以开机的时候,做为Windows服务自动启动。这个可以使用wrapper第三方类库,有开源的版本。项目网站:http://wrapper.tanukisoftware.org/doc/english/download.jsp,可参考的文章:http://hugebait.javaeye.com/blog/47262,其实上网查找wrapper,有很多文章,配置的时候,主要是要注意路径的问题。
2)使用jregistrykey直接操作注册表,这也是一个第三方类库,提供了直接操作注册表的功能http://sourceforge.net/projects/jregistrykey/,上网查也有很多资料。
3)自己写DLL,通过JNI调用。其实上面两个类库,都是通过JNI方式提供的。

第一种,一般用作服务器程序,托盘方式或者无界面的,你的程序可能比较合适第二种方式。需要操作'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run'
简单例子
//注册表位置
String regdir = "\\Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//名字
String rname="myRun";
//执行程序,可以做成批处理,或者转成exe,总之能够运行你程序的路径
String rexe="c:\\run.bat";
RegistryKey r = new RegistryKey(RootKey.HKEY_LOCAL_MACHINE, regdir);
RegistryValue vlaue1=new RegistryValue(rname,ValueType.REG_SZ,rexe);
r.setValue(vlaue1);
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-01-29
java.util.prefs操作注册表是限制死在一个JAVASOFT的节点下的,无法操作其他WINDOWS注册表节点的。
必须JNI本地接口利用C语言来调用WIN32API访问注册表函数去实现。

还有一种办法是调用cmd命令
import java.io.IOException;

public class Test {
public static void main(String[] args) throws IOException {
String key="HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
String name="myname";//启动项名称
String value="mypath";//程序路径
String command="reg add "+key+" /v "+name+" /d "+value;
Runtime.getRuntime().exec(command);
}
}

BS楼主,解决问题了不采纳答案!本回答被提问者采纳
第2个回答  2010-01-28
我不知道你的程序上面是否有选项那种配置面板,所以我直接用JFrame模拟了一个配置开机启动eclipse的面板,你移植到你本地程序即可

import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;

import javax.swing.JCheckBox;
import javax.swing.JFrame;

public class test {
public void init(){
JFrame.setDefaultLookAndFeelDecorated(true);

JFrame frame = new JFrame("测试开机启动");
frame.setLayout(new FlowLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JCheckBox check = new JCheckBox();
check.setText("开机自动启动");
check.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
JCheckBox cb = (JCheckBox) e.getSource();
try {
changeStart(cb.isSelected());
} catch (IOException e1) {
e1.printStackTrace();
}

}
});
frame.getContentPane().add(check);

//显示窗体
frame.setSize(200,300);
frame.setVisible(true);
}
/**
* Reg 参数说明
* /v 所选项之下要添加或删除的值名
* /t RegKey 数据类型(reg_sz字符串)
* /d 要分配给添加的注册表 ValueName 的数据
* /f 不用提示就强行删除
*/
public void changeStart(boolean isStartAtLogon) throws IOException{
String regKey = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
String myAppName = "MyApp";
String exePath = "D:\\Software\\eclipse\\eclipse.exe";
Runtime.getRuntime().exec("reg "+(isStartAtLogon?"add ":"delete ")+regKey+" /v "+myAppName+(isStartAtLogon?" /t reg_sz /d "+exePath:" /f"));
}

public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new test().init();
}
});
}
}
第3个回答  2010-01-29
写成一个bat文件,然后放到C:\Documents and Settings\Administrator\「开始」菜单\程序\启动 目录下
例如:在D盘根目录下有一java程序,为Test.java
在记事本里写:
d:
javac Test.java
java Test
保存为:test.bat 然后把test.bat文件放到上述的文件夹里。
重启机器试试
第4个回答  2010-02-01
可以通过程序打包安装软件来实现。比如:Inno Setup
你写的程序怎么都要打成像QQ那样的安装程序,安装包在安装时可以让用户选择是否开机启动或者默认设置成开机启动。
相似回答