从Process.Start启动时,应用程序图标为空

时间:2017-10-12 05:23:02

标签: c# windows winforms installaware

FileInfo fi = new FileInfo(fileToExcecute);
Directory.SetCurrentDirectory(fi.DirectoryName);

ProcessStartInfo pInfo = new ProcessStartInfo();
pInfo.FileName = fileToExcecute;
pInfo.RedirectStandardOutput = false;
pInfo.RedirectStandardError = false;
pInfo.CreateNoWindow = false;
pInfo.UseShellExecute = true;
pInfo.WorkingDirectory = fi.DirectoryName;
if (runas)
    pInfo.Verb = "runas";
pInfo.WindowStyle = ProcessWindowStyle.Normal;

Process p = Process.Start(pInfo);

任务栏中缺少应用程序图标。这只是一个空白的广场!

以上代码适用于多个项目但是使用一个特定程序失败 - 我们称之为projectX.exe。我重新编写了projectX.exe的Main和启动方法,以便它们模仿另一个显示其图标的项目。

我已经尝试了好几天才发现原因但却失败了。我尝试过各种想法,包括更改图标,在运行时更改图标,以及切换是否应显示图标。

如果我要求以管理员身份运行projectX.exe,则图标显示正常,但我的客户无法使用该选项。

2017年10月20日编辑 如果我将“projectX.exe”的名称更改为其他名称(例如“test.exe”),则该图标会在任务栏中显示“确定”。存储在注册表中的程序的图标在哪里?

2017年10月22日编辑 按照建议刷新图标后,从文件资源管理器运行程序或创建快捷方式时,任务栏中不再显示该图标。

2017年11月12日编辑 以“管理员”身份运行程序,图标会按预期显示在任务栏中。

3 个答案:

答案 0 :(得分:6)

  

如果我将'projectX.exe'的名称更改为其他内容...则图标显示OK。

肯定是图标缓存引发的问题。目前还不是很清楚为什么重置它并没有帮助解决这个问题,但看起来你手动完成它并且有办法不能正确地进行平移。

一些背景知识。这个问题在开发机器上很常见,程序员只有在调试和测试程序后才会处理chrome。资源管理器必须使用错误的图标查看其program.exe文件并将其复制到其缓存中。更改.exe不会强制它刷新缓存的副本,可以说是一个bug。缓存对于资源管理器来说非常重要,在文件夹视图中挖掘文件中的图标完整的文件可以在主轴驱动器上轻松地进行几秒钟。

缓存存储在文件中,而不是注册表中。你会在c:\ users \ yourname \ appdata \ local \ iconcache.db中找到它,请注意它是一个隐藏文件。 Windows 8及更高版本使用带有多个图标* .db文件的更加漂亮的缓存方案,存储在c:\ users \ yourname \ appdata \ local \ microsoft \ windows \ explorer目录中。

删除这些文件足以强制资源管理器重新创建它们。但这并不一定是个好结果,您只能100%确定资源管理器通过在删除文件之前终止它来创建新副本。如果在执行此操作时打开缓存文件,其他进程可能会锁定这些文件,通常是因为它们已加载了shell扩展。

我认为重置缓存的最佳方法是使用Ramesh Srinivasan的cleariconcache.vbs脚本,该脚本可从this web page获得。他的VBScript代码看起来令人信服,处理所有角落案件并尽职尽责地报告失败。关闭所有正在运行的程序,为其提供最大的成功几率。

答案 1 :(得分:1)

如果不完全了解您的环境,很难诊断出这个问题。

但这听起来好像是操作系统问题,而不是代码问题。

一个选项可能是在重新启动explorer.exe时以编程方式清除图标缓存,以下代码应执行此操作:

foreach (Process exe in Process.GetProcesses())
{
     if (exe.ProcessName.StartsWith("iexplore"))
         exe.Kill();
     }

     // clear icon cache
     strCmdText= "del %userprofile%\appdata\local\iconcache.db /a ";
     Process.Start("CMD.exe",strCmdText);

     Process.Start("explorer.exe");
}

现在可以看到您的图标。

答案 2 :(得分:0)

我们遇到了完全相同的问题,但是在我们的案例中,事实证明我们的图标太大(以kb为单位)。一旦我们将其缩小为kb,问题就解决了!