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

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。 我已经重写了Main以及projectX.exe的启动方法,以便它们模仿另一个显示其图标的项目。

我试了好几天才发现为什么,却一直没有成功。 我已经尝试了各种想法,包括更改图标,在运行时更改它,以及切换是否应该显示。

如果我要求以pipe理员身份运行projectX.exe,则图标显示正常,但该选项对我的客户端不可用。

编辑2017年10月20日如果我更改“projectX.exe”的名称为例如'test.exe',则图标在任务栏中显示确定。 存储在registry中的程序的图标在哪里?

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

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

Solutions Collecting From Web of "从Process.Start启动时,应用程序图标为空"

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

绝对是一个图标缓存引发的问题。 不清楚为什么重置它并不能帮助解决这个问题,但是看起来你是手工完成的,而且没有正确的方法。

一些背景。 这个问题在开发机器上是相当普遍的,程序员只有在程序调试完毕后才会考虑使用chrome。 资源管理器有错误的图标看到他们的program.exe文件,并将其复制到其缓存中。 更改.exe不会强制它刷新缓存副本,可以说是一个错误。 缓存对于资源管理器来说非常重要,在文件夹视图中挖掘图标可以在主轴驱动器上轻松完成几秒钟。

缓存存储在一个文件中,而不是注册表中。 您可以在c:\ users \ yourname \ appdata \ local \ iconcache.db中找到它,注意这是一个隐藏的文件。 Windows 8及更高版本使用一个更多fancier缓存方案与多个图标* .db文件,存储在c:\ users \ yourname \ appdata \ local \ microsoft \ windows \ explorer目录中。

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

我认为重置缓存的最好方法是使用Ramesh Srinivasan的cleariconcache.vbs脚本, 该脚本可从此网页获得 。 他的VBScript代码看起来很有说服力,照顾所有的角落案例和尽职报告失败。 关闭所有正在运行的程序,使其成功的可能性最大。

如果没有充分了解您的环境,这个问题很难诊断。

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

一个选项可能是以编程方式清除图标缓存,同时重新启动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"); } 

你的图标应该有希望现在可见。