这段代码我想很多人都看过了
不过有很多地方不是很明白
麻烦各位看下
import java.lang.reflect.Method;
import java.util.prefs.Preferences;public class RegHack {
    /*这下面的0x800000001是什么呢?源代码里面说的Native_Handl?*/
    private static final int HKEY_CURRENT_USER = 0x80000001;    private static final int KEY_QUERY_VALUE = 1;    private static final int KEY_SET_VALUE = 2;
  
    private static final int KEY_READ = 0x20019;    public static void main(String args[]) {
        final Preferences userRoot = Preferences.userRoot();
        final Class clz = userRoot.getClass();
        try {
            /*访问注册表做查询之类的 是不是就要先打开*/
            final Method mOpenKey = clz.getDeclaredMethod("openKey",
                    byte[].class, int.class, int.class);
            mOpenKey.setAccessible(true);            final Method mCloseKey = clz.getDeclaredMethod("closeKey",
                    int.class);
            mCloseKey.setAccessible(true);            final Method mWinRegQueryValue = clz.getDeclaredMethod(
                    "WindowsRegQueryValueEx", int.class, byte[].class);
            mWinRegQueryValue.setAccessible(true);
            final Method mWinRegEnumValue = clz.getDeclaredMethod(
                    "WindowsRegEnumValue1", int.class, int.class, int.class);
            mWinRegEnumValue.setAccessible(true);
            final Method mWinRegQueryInfo = clz.getDeclaredMethod(
                    "WindowsRegQueryInfoKey1", int.class);
            mWinRegQueryInfo.setAccessible(true);            final String subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
            /*这个hSettings.intValue()的值是什么呢?为什么即使上面路径不存在也是大于 -1*/
            Integer hSettings = (Integer) mOpenKey.invoke(userRoot,
                    toByteArray(subKey), KEY_READ, KEY_READ);
            byte[] b = (byte[]) mWinRegQueryValue.invoke(userRoot, hSettings
                    .intValue(), toByteArray("ProxyServer"));
            String s = b != null ? new String(b).trim() : null;
            System.out.println(s);
            mCloseKey.invoke(Preferences.userRoot(), hSettings);        } catch (Exception e) {
            e.printStackTrace();
        }
    }    private static byte[] toByteArray(String str) {
        byte[] result = new byte[str.length() + 1];
        for (int i = 0; i < str.length(); i++) {
            result[i] = (byte) str.charAt(i);
        }
        result[str.length()] = 0;
        return result;
    }
}

解决方案 »

  1.   

    我现在的想法修改程序是去判断某个键是否存在
    可是要怎么做呢?它又没有NodeExists方法
      

  2.   

     final String subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; 
         /*这个hSettings.intValue()的值是什么呢?为什么即使上面路径不存在也是大于 -1*/  Integer hSettings = (Integer) mOpenKey.invoke(userRoot, 
                 toByteArray(subKey), KEY_READ, KEY_READ); 本来想用这个判断 可是该怎么做呢?或者是用这个查询?
    byte[] b = (byte[]) mWinRegQueryValue.invoke(userRoot, hSettings 
                        .intValue(), toByteArray("ProxyServer")); 如果用这个查询 这个是查Value的 怎么查键呢?
      

  3.   

    用到了操作系统的东西吧,不过用java跟操作系统打交道本来就不是一件易事,用wsh可以轻易实现的功能在java做来就是到处碰壁
      

  4.   

    Java对注册表的直接操作非常有限, 如果使用native方法的话, 那就可以为所欲为了.
    网络上也已经有人提供了访问注册表的包, 可以使用.
      

  5.   

    java自身也有类可以操作注册表,但是非常局限。
    想自由操作的话,估计得要JNI了
      

  6.   

    我自己已经解决这个问题了
    现在算是可以自由访问注册表了
    注册表的键值可以类似这样定义
    final String subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; 接着这样做
    public static int[] openKey1(int hkey, byte[] windowsAbsolutePath,
    int securityMask) throws Exception {
    Class theClass = Class.forName("java.util.prefs.WindowsPreferences");
    Method m = theClass.getDeclaredMethod("WindowsRegOpenKey", new Class[] {
    int.class, byte[].class, int.class });
    m.setAccessible(true);
    Object ret = m.invoke(null, new Object[] { new Integer(hkey),
    windowsAbsolutePath, new Integer(securityMask) });
    return (int[]) ret;
    }
    int[] result = openKey1(hkey, Path, KEY_QUERY_VALUE);
    /*判断*/
    if (result[0] != 0) {../*说明不存在*/.........}大致就是这样
    要用到的主要有这连个
    import java.lang.reflect.*;
    import java.util.prefs.*;谢谢各位回复 结贴 散分