Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Application icon is blank when started from 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);

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.

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 in the taskbar. Where are the icons for a program stored in the registry?

Edit 22nd October 2017 After refreshing the icons as suggested, when running the program from File Explorer or creating a shortcut, the icon is no longer displayed in the taskbar.

Edit 12th November 2017 Running the program 'As Administrator', the icon displays in the taskbar as expected.

like image 531
David Avatar asked Oct 12 '17 05:10

David


People also ask

Why are my Windows icons blank?

Buggy or outdated system files is another reason that can prevent the desktop, taskbar or the Start menu from functioning correctly. Installing the latest updates can help fix things like blank icons in Windows 10. 1. Open the Start menu and go to Settings > Update & Security > Windows Update.

Why is my outlook icon a blank page?

Click on the "Tools" menu in Outlook and select "Options." Under Preferences, click "Email Options," then "Advanced Email Options." Check "Show an envelope icon in the notification area" to restore the icon.


2 Answers

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.

like image 53
Hans Passant Avatar answered Oct 04 '22 00:10

Hans Passant


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.

like image 45
K-Dawg Avatar answered Oct 04 '22 00:10

K-Dawg