`

读取本地计算机中的安装程序列表

阅读更多

这几天一直被读取本地计算机中的安装程序列表这个问题搞的头昏脑涨。

在开始的时候,我本来是想找个Open Source的软件来搞定这个问题的,但是找了好久也没有能用的,更不要说找个能够被调用的啦!于是自己就想办法看看能不能把这个问题搞定!

在网上找了好久 ,找到了一个非常有用的信息 ,那就是计算机中所有的安装程序在存在在注册表中,路径是:HKEY_LOCAL_MACHINE SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall。在这个键下面的所有子键就是在本地计算机中的所有的安装程序,而所有的程序名存储在DisplayName字段中。

由于在开始时,需要用JAVA来实现,所以就在网上找到了一个Sigar.jar,全称是org.hyperic.sigar,在这个包下面有个类RegistryKey,路径是org.hyperic.sigar.win32.RegistryKey。
使用Java的实现时,首先必须先包含Sigar.jar,实现过程如下:
public String[] getDisplayNames()
    {
        String[] namesList=null;
        String[] displayNames=null;
        try
        {
            RegistryKey rk=RegistryKey.LocalMachine.openSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");//用于打开注册表目录。
            namesList=rk.getSubKeyNames();//获取注册表中的所有子键名。
            displayNames=new String[namesList.length];
            for(int i=0;i<namesList.length;i++)
            {
                RegistryKey subrk=rk.openSubKey(namesList[i]);
                displayNames[i]=subrk.getStringValue("DisplayName", "nothing"); ;//获取displayName。其中第二个参数"Nothing"为"DisplayName"的默认值,如果"DisplayName"不存在,则"DisplayName"的值为"Nothing"。              
            }
        }
        catch(Exception err)
        {
        }       
        return displayNames;//返回
    }

使用C#的实现过程如下:
public string[] getDisplayNames()
        {
            Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");//用于打开注册表目录。
            String[] keyNames = rk.GetSubKeyNames();//获取注册表中的所有子键名。
            String[] displayNames = new String[keyNames.Length];//声明用于存储displayName的字符串数组。
            for (int i = 0; i < keyNames.Length; i++)//用于循环读取DisplayName
            {
                Microsoft.Win32.RegistryKey subkey = rk.OpenSubKey(keyNames[i]);//根据子键名,来打开子键。
                string displayName = subkey.GetValue("DisplayName", "Nothing").ToString();//获取displayName。其中第二个参数"Nothing"为"DisplayName"的默认值,如果"DisplayName"不存在,则"DisplayName"的值为"Nothing"。
                displayNames[i] = displayName; //对数组赋值
            }
            return displayNames;//返回
        }

在读取了DisplayName字段之后,也并不意味着读取了正确的程序名。DisplayNames中存在一些值为Nothing的情况, 而且也存在Windows的安装更新程序,这就需要对DisplayNames中的某些值进行过滤。

最后有一点需要说明的是,这种读取注册表的方法只能在windows系统中使用。

分享到:
评论
1 楼 di1984HIT 2014-02-17  
不错,学习了

相关推荐

Global site tag (gtag.js) - Google Analytics