我想用C#获得我电脑上所有程序的列表。我知道我可以扫描注册表,就像这样:
var regClis = Registry.ClassesRoot.OpenSubKey("CLSID");
var progs = new List<string>();
foreach (var clsid in regClis.GetSubKeyNames()) {
var regClsidKey = regClis.OpenSubKey(clsid);
var ProgID = regClsidKey.OpenSubKey("ProgID");
var regPath = regClsidKey.OpenSubKey("InprocServer32");
if (regPath == null)
regPath = regClsidKey.OpenSubKey("LocalServer32");
if (regPath != null && ProgID != null) {
var pid = ProgID.GetValue("");
var filePath = regPath.GetValue("");
progs.Add(pid + " -> " + filePath);
regPath.Close();
}
regClsidKey.Close();
}代码来自this blog.
有人知道有没有更简单的方法吗?此外,据我所知,上面的代码可能只会给我提供进程内com。如果我也需要进程外的progids怎么办?
提前感谢
发布于 2012-10-04 17:48:06
这将为您提供所有注册的ProgID,无论是本地的还是远程的(当然是作为进程外的,而不是另一台计算机)。此外,代码只是枚举注册表项,这已经很简单了。
如果问题是‘有没有一个特定的API来解决这个问题’,那就不会有女士提供的API,很可能有一些第三方实现基本上和这个代码做了同样的事情。
发布于 2012-10-04 18:08:37
这太简单了。在CLSID键中列出ProgId是一个选项,但不是必需的。在我的机器上没有ProgID的例子有公文包、CABFolder、FaxCommon.1、JobObject、NetworkConnections、Shell.AutoPlay等等。
您必须从迭代根开始,并查找具有名为CLSID的子键的键。这将为您提供clsid guid。然后打开HKCR\CLSID\{guid}并查找路径。
您还必须注意仅为当前用户注册的ProgID。要做到这一点,首先迭代HKCU\Software\Classes并过滤您在迭代HKCR时找到的任何重复项。
请注意,这一切都是相当危险的,在设计糟糕的COM组件注册过程中,您会遇到很多垃圾。使用try/catch来捕获垃圾。
https://stackoverflow.com/questions/12723821
复制相似问题