3

我有这段代码可以获取名称,但是如何获取每个程序的图标?

 string SoftwareKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\S-1-5-18\\Products";
        RegistryKey rk = default(RegistryKey);
        rk = Registry.LocalMachine.OpenSubKey(SoftwareKey);

        string sname = string.Empty;

        foreach (string skname in rk.GetSubKeyNames())
        {

            try
            {
                sname = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skname).OpenSubKey("InstallProperties").GetValue("DisplayName").ToString();
                string Inst1 = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skname).OpenSubKey("InstallProperties").GetValue("InstallLocation").ToString();
                int n = dataGridView1.Rows.Add();
                dataGridView1.Rows[n].Cells[2].Value = sname; 
                dataGridView1.Rows[n].Cells[3].Value = Inst1;
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
            }
        }
4

2 回答 2

4

我不知道这InstallProperties会给你安装的可执行文件(因为安装程序确实可以安装多个可执行文件)。

如果您有办法确定正确的可执行文件(可能包括枚举 .exe 中的文件InstallLocation),那么您可以从该 .exe 中获取默认图标。

有关详细信息,请参阅

获取 Shell 使用的文件图标

更新

以下代码未经测试,但应该让您非常接近:

string Inst1 = registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skname).OpenSubKey("InstallProperties").GetValue("InstallLocation").ToString();

foreach (string file in Directory.GetFiles(Inst1, "*.exe")) 
{
    string filePath = Path.Combine(Inst1, file);
    Icon  result = Icon.ExtractAssociatedIcon(filePath);
    // If result is not null, you have an icon.
}
于 2012-07-04T06:35:16.617 回答
2

试试这个:

Icon  result = Icon.ExtractAssociatedIcon(filePath); 
于 2012-07-04T06:40:51.300 回答