按照this MSDN blog中的代码,我在C#中提出了以下代码
using Shell32; //Browse to C:\Windows\System32\shell32.dll
private void GetInstalledPrograms()
{
Shell shell = new Shell();
Shell objShell = shell.Application;
string folderName = @"::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\" +
"::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}";
var objProgramList = objShell.NameSpace(folderName);
if (objProgramList != null)
{
MessageBox.Show(objProgramList.Items().ToString());
}
else
{
MessageBox.Show("Null");
}
}
出于某种原因,objProgramList
是null
。奇怪的是,通过以下powershell代码,我得到了我正在寻找的东西!我不知道自己做错了什么。对我来说,我的代码的两个例子都是相同的......
$Shell = New-Object -ComObject Shell.Application
$folderName = "::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E- EB907A5126C5}"
$folder = $Shell.NameSpace($folderName)
if($folder)
{
$folder.Items()
}
答案 0 :(得分:0)
您是否有机会使用Window 8?根据{{3}},创建一个类似于它的shell在Window 8中不起作用。
答案 1 :(得分:0)
这个答案为时已晚,但可能会帮助其他人解决同样的问题。
基本上,代码上的问题是shell命令:
string folderName = @"::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\" +
"::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}";
它应该在命令的开头包含“shell:”,它应该如下所示:
string folderName = @"shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}"
要获取有关Name,Publisher,Installed On等程序的信息,请尝试使用此代码枚举所有可用字段:
List<string> arrHeaders = new List<string>();
for (int i = 0; i < short.MaxValue; i++)
{
string header = list.GetDetailsOf(null, i);
if (String.IsNullOrEmpty(header))
break;
arrHeaders.Add(header);
}
foreach (Shell32.FolderItem2 item in list.Items())
{
for (int i = 0; i < arrHeaders.Count; i++)
{
//I used listbox to show the fields
listBox1.Items.Add(string.Format("{0}\t{1}: {2}", i, arrHeaders[i], list.GetDetailsOf(item, i)));
}
}