注:ICE_JNIRegistry.dll 和registry.jar这两个文件可在我的资源中下载
如果你在系统中需要经常使用DOS进入某个文件夹,一般的做法就是打开”运行”,在命令文本框中输入cmd,然后再在出现的
DOS界面中输入要达到的文件夹的路径。有没有更好的办法呢?比如说右击一个文件夹,将出现一个菜单项为“命令提示符”,单击
此菜单项则会直接进入DOS,而且DOS提示的当前路径也就是文件夹的路径。 要达到这个目的,修改注册表即可。当然我们这里讨论
的是如何使用JAVA 来做到这点。其实就是使用JAVA来操作注册表。
使用JAVA操作注册表的方法有几种,最简单的方法就是使用JAVA本身提供的API 来操作,即java.util.prefs,使用其中的类
Preferences,但是如果使用自带的API则只能在 Win32 下用来操作 HKCU/Software/JavaSoft 和 HKLM/Software/JavaSoft 下及子节
点的数据。如果需要达到添加右键菜单的功能,必须修改HKEY_CLASSES_ROOT子键内容。也就是说JAVA自带的API做不到自由访问注册
表的键值。不过JAVA提供了一个很好的方式称为JNI,实际上就是通过C或C++提供的方法操作注册表,它们所写的程序可生成DLL文件
,然后在JAVA中调用DLL。这里关于如何使用C或C++就不多说了,网上也有成堆的文章,想了解的可以去看看。在这里我使用一个开
源的项目gdapi。以下把使用的详细步骤介绍一下
第一步、把论坛上的registry-3.1.3.zip下载到本机
第二步、将registry-3.1.3.zip解压,解压之后会产生目录bin, classes, doc, source。这里只需要bin目录,打开bin目录,在其
中会有两个文件ICE_JNIRegistry.dll 和registry.jar
第三步、新建一个工程,你可以采用任意开发工具,这里采用MyEclipse。打开MyEclipse新建一个Java Project, 然后将
registry.jar包添加到工程中来,并且将ICE_JNIRegistry.dll文件复制到工程的根目录下。
第四步、编写Java代码调用dll. 实现右击文件夹时将”命令提示符”添加到右键菜单下。
首先要确定需要修改的注册表项为HKEY_CLASSES_ROOT//Directory//shell
package com;
/**
*Java 操作注册表,为文件夹添加右键菜单cmd
*author: zhouh
*/
import java.io.UnsupportedEncodingException;
import com.ice.jni.registry.NoSuchKeyException;
import com.ice.jni.registry.RegStringValue;
import com.ice.jni.registry.Registry;
import com.ice.jni.registry.RegistryException;
import com.ice.jni.registry.RegistryKey;
public class RegisterManager{
/*定义目录字符串*/
private static String dir = "Directory//shell";
/*注册表键对象*/
private static RegistryKey rkey;
/*为dir添加set和get方法*/
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
}
/*构造函数,打开HKEY_CLASSES_ROOT中的dir*/
private RegisterManager() {
rkey = Registry.openSubkey(Registry.HKEY_CLASSES_ROOT,
dir ,
RegistryKey.ACCESS_WRITE);
}
/*创建子目录方法*/
public void createSubDir(String subDirName,String key, String defaultValue) throws RegistryException {
/*根据传入的参数创建子目录*/
rkey.createSubKey(subDirName, "");
/*打开当前创建的子目录,设置为可写状态*/
rkey = Registry.openSubkey(Registry.HKEY_CLASSES_ROOT,
dir+"//"+subDirName,
RegistryKey.ACCESS_WRITE);
/*设置当前子目录的默认注册表项的值*/
rkey.setValue(new RegStringValue(rkey, key, defaultValue));
/*重新设置当前目录,为方便此目录下再添加子目录*/
this.setDir(dir+"//"+subDirName);
}
public static void main(String[] args) throws NoSuchKeyException, RegistryException,
UnsupportedEncodingException{
/*创建对象*/
RegisterManager rm = new RegisterManager();
/*创建子项CommandPrompt,默认的value值为cmd, 那么在文件夹的右键菜单下即会显示cmd*/
rm.createSubDir("CommandPrompt", "", "cmd");
/*在CommandPrompt项下创建子项Command,值为(cmd.exe /k cd /"%1/") 也就是单击cmd所要执行的操作*/
rm.createSubDir("Command", "", "cmd.exe /k cd /"%1/"");
}
复制代码运行结束后,找到任意一个文件夹,右击此文件夹将会出现cmd菜单项,选择此项将会进入dos,当前目录为此文件夹的目录