需要修改的注册表项
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run] 开机自动运行程序
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/RunOnce] 开机自动运行程序 且 仅运行一次
[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/RunServices] 开机自动运行服务
JDK 从1.4开始提供操作 Windows 的 API 是 Preferences,因为这个 API 也是跨平台的,所功能比较弱,在 Win32 下只能用来操作 HKCU/Software/JavaSoft 和 HKLM/Software/JavaSoft 下及子节点的数据。
自由访问注册表其他键的值光用 Java 是做不到的,必然方案就是 JNI,这里我使用的是Windows Registry API Native Interface http://www.trustice.com/java/jnireg/index.shtml 下的 registry-3.1.3.zip(包含源代码)。可以利用它访问、修改、导出注册表项到文件等。解开 registry-3.1.3.zip,在 bin 目录中可以看到两个文件 ICE_JNIRegistry.dll 和 registry.jar,动态库就是本地代码实现。
com.ice.jni.registry.Registry.main() 就是 registry 的示例代码,动态库 ICE_JNIRegistry.dll 也是在这个类的静态块中被加载的,记得要把 ICE_JNIRegistry.dll 放在它能够被加载的位置上,比如你把 registry-3.1.3.zip 解压到 c:/registry-3.1.3,在命令行下你可以进入到这个目录中,并执行。
代码:
package org.zh.ss.util; import com.ice.jni.registry.*; import java.text.SimpleDateFormat; /** *//** * java 操作注册表 * @author 李志远 */ public class RegeditTool { static SimpleDateFormat shortDateFormat = new SimpleDateFormat("yyyy-MM-dd"); /** *//** */ /** *//** Creates a new instance of test */ // 把信息存储到注册表HKEY_LOCAL_MACHINE下的某个节点的某一变量中,有则修改,无则创建 public static boolean setValue(String folder, String subKeyNode, String subKeyName, String subKeyValue) { try { RegistryKey software = Registry.HKEY_LOCAL_MACHINE .openSubKey(folder); RegistryKey subKey = software.createSubKey(subKeyNode, ""); subKey .setValue(new RegStringValue(subKey, subKeyName, subKeyValue)); subKey.closeKey(); return true; } catch (NoSuchKeyException e) { e.printStackTrace(); } catch (NoSuchValueException e) { e.printStackTrace(); } catch (RegistryException e) { e.printStackTrace(); } return false; } // 删除注册表中某节点下的某个变量 public static boolean deleteValue(String folder, String subKeyNode, String subKeyName) { try { RegistryKey software = Registry.HKEY_LOCAL_MACHINE .openSubKey(folder); RegistryKey subKey = software.createSubKey(subKeyNode, ""); subKey.deleteValue(subKeyName); subKey.closeKey(); return true; } catch (NoSuchKeyException e) { System.out.println("NOsuchKey_delete"); } catch (NoSuchValueException e) { System.out.println("NOsuchValue_delete"); } catch (RegistryException e) { e.printStackTrace(); } return false; } // 删除注册表中某节点下的某节点 public static boolean deleteSubKey(String folder, String subKeyNode) { try { RegistryKey software = Registry.HKEY_LOCAL_MACHINE .openSubKey(folder); software.deleteSubKey(subKeyNode); software.closeKey(); return true; } catch (NoSuchKeyException e) { e.printStackTrace(); } catch (RegistryException e) { e.printStackTrace(); } return false; } // 打开注册表项并读出相应的变量名的值 public static String getValue(String folder, String subKeyNode, String subKeyName) { String value = ""; try { RegistryKey software = Registry.HKEY_LOCAL_MACHINE .openSubKey(folder); RegistryKey subKey = software.openSubKey(subKeyNode); value = subKey.getStringValue(subKeyName); subKey.closeKey(); } catch (NoSuchKeyException e) { value = "NoSuchKey"; // e.printStackTrace(); } catch (NoSuchValueException e) { value = "NoSuchValue"; // e.printStackTrace(); } catch (RegistryException e) { e.printStackTrace(); } return value; } // 测试 public static void main(String[] args) { setValue("SOFTWARE", "Microsoft//Windows//CurrentVersion//Run", "test", "C://1.exe"); } }