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);
The application icon is missing from the taskbar. It's just a blank square!
The above code works fine for several projects however fails with one specific program - lets call it projectX.exe. I have re-written the Main as well as startup methods of projectX.exe so that they mimic another project that displays its icon fine.
I have tried for days to discover why but have failed dismally. I have tried various ideas including changing the icon, changing it at runtime, as well as toggling whether it should be displayed or not.
The icon is displayed OK when started from it's own shortcut or directly clicking on it in explorer. The icon only fails to display when run from process.start .
If I require that projectX.exe be run as administrator, the icon displays fine but that option is not available to my clients.
Edit 20 Oct 2017 If I change the name of 'projectX.exe' to something else for example 'test.exe', then the icon shows OK. Where are the icons for a program stored in the registry?
2 Answers
Answers 1
If I change the name of 'projectX.exe' to something else ... then the icon shows OK.
This is definitely an icon cache induced problem. It is not very clear why resetting it did not help to solve this problem, but it looks like you did it by hand and that has ways of not panning out correctly.
Some background. This problem is pretty common on a dev machine, programmers tend to take care of the chrome only after getting their program debugged and tested. Explorer got to see their program.exe file with the wrong icon and copied that into its cache. Changing the .exe does not force it to refresh the cached copy, arguably a bug. The cache is otherwise pretty important for Explorer, digging the icons out of the files on a folder view full of files can take any easy handful of seconds on a spindle drive.
The cache is stored in a file, not the registry. You'll find it back in c:\users\yourname\appdata\local\iconcache.db, beware that it is a hidden file. Windows 8 and up use a much fancier caching scheme with multiple icon*.db files, stored in the c:\users\yourname\appdata\local\microsoft\windows\explorer directory.
Deleting these files is enough to force Explorer to re-create them. But that doesn't necessarily come a good end, you can only be 100% sure that Explorer creates a fresh copy by terminating it before you delete the files. And other processes may have a lock on these files if they have the cache file open while you are doing this, typically because they have a shell extension loaded.
I think the best way to reset the cache is by using Ramesh Srinivasan's cleariconcache.vbs script, available from this web page. His VBScript code looks convincingly right, taking care of all the corner-cases and dutifully reporting failure. Close all running programs to give it maximum odds for success.
Answers 2
The issue is very hard to diagnose without a full understanding of your environment.
This does however sound like it could well be an operating system issue rather than a problem with your code.
One option might be to programatically clear the icon cache whilst restarting explorer.exe the following code should do this:
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"); }
Your icon should hopefully be visible now.
0 comments:
Post a Comment