获取程序和功能列表

时间:2014-04-01 19:39:38

标签: c# winforms

按照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");
    }            
}

出于某种原因,objProgramListnull。奇怪的是,通过以下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()  
}    

2 个答案:

答案 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)));
    }
}