Hoy me encontré en una situación algo extraña, necesitaba instalar un programa de terceros ...un reemplazamiento del botón de inicio apra Windows 8, y necesito que este proceso sea automatizado, pero al instalar este programa de forma silenciosa al terminar la instalación se mataba de forma automática el explorer.exe ...ya que el instalador así lo requiere, desaparecia el fondo, el taskbar, el explorer, quedando visible sólamente un fondo de un color solido.
La solución manual a este problema (al cual me he enfreentado muchas veces) es tan simple como abrir el administrador de tareas para ejecutar el explorer.exe, o hacerlo desde la consola de windows (CMD), pero como ya dije necesitaba automatizar la tarea así que intenté hacerlo desde la CMD, el problema es que al parecer esto no es suficiente Windows 8/8.1 (Desde la CMD).
...Por más que intenté ejecutar de forma automatizada el explorer.exe después de la instalación de este software sólamente se abria una ventana del explorer, quiero decir... los elementos del escritorio no se reinicializaban (taskbar, wallpaper, explorer...), y esa es la razón de porque he escrito esta pequeñísima mini-utilidad en VB.NET la cual me ha resuelto el problema.
Aquí tienen el source y un ejemplo de uso real (la aplicación del ejemplo es solo para Windows 8.1) si probais el ejemplo hacedlo en una VM no en vuestro PC ~> http://www.mediafire.com/download/nh8z5bkglh9se36/InitializeExplorer%20Sample.rar
El código fuente de la aplicación sólamente es esto, supongo que habrá escasas personas que tengan el mismo problema, pero bueno, que lo disfruten:
Código
#Region " Imports " Imports System.IO Imports System.Runtime.InteropServices Imports RefreshExplorer.NativeMethods #End Region ''' <summary> ''' Initializes a new instance of Explorer process. ''' </summary> Module RefreshExplorer #Region " P/Invoke " ''' <summary> ''' Class NativeMethods. ''' </summary> Friend Class NativeMethods ''' <summary> ''' Retrieves a handle to the top-level window whose class name and window name match the specified strings. ''' This function does not search child windows. ''' This function does not perform a case-sensitive search. ''' </summary> ''' <param name="lpClassName"> ''' The class name or a class atom created by a previous call to the ''' RegisterClass or RegisterClassEx function. ''' The atom must be in the low-order word of lpClassName; ''' the high-order word must be zero. ''' If lpClassName points to a string, it specifies the window class name. ''' The class name can be any name registered with RegisterClass or RegisterClassEx, ''' or any of the predefined control-class names. ''' If lpClassName is NULL, it finds any window whose title matches the lpWindowName parameter. ''' </param> ''' <param name="zero"> ''' The window name (the window's title). ''' If this parameter is NULL, all window names match.</param> ''' <returns>IntPtr.</returns> <DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Unicode)> Public Shared Function FindWindowByClass( ByVal lpClassName As String, ByVal zero As IntPtr ) As IntPtr End Function End Class #End Region #Region " ReadOnly Strings " ''' <summary> ''' Indicates the directory where the Explorer process is located. ''' </summary> Private ReadOnly ExplorerDirectory As String = Environment.GetFolderPath(Environment.SpecialFolder.Windows) ''' <summary> ''' Indicates the filename of the process. ''' </summary> Private ReadOnly ExplorerFilename As String = "Explorer.exe" ''' <summary> ''' Indicates the desk Taskbar Class-name. ''' </summary> Private ReadOnly TaskBarClassName As String = "Shell_TrayWnd" #End Region #Region " Process " ''' <summary> ''' The explorer process. ''' </summary> Dim Explorer As New Process With { .StartInfo = New ProcessStartInfo With { .FileName = Path.Combine(ExplorerDirectory, ExplorerFilename), .WorkingDirectory = My.Application.Info.DirectoryPath, .UseShellExecute = True } } #End Region #Region " Main " ''' <summary> ''' Defines the entry point of the application. ''' </summary> Sub Main() Select Case Convert.ToBoolean(CInt(FindWindowByClass(TaskBarClassName, Nothing))) Case False ' The Taskbar is not found. Try Explorer.Start() Console.WriteLine("Windows Explorer has been re-initialized successfully") Environment.Exit(0) Catch ex As Exception Console.WriteLine(ex.Message) Environment.Exit(1) End Try Case True ' The Taskbar is found. Console.WriteLine("Can't proceed, Windows Explorer is currently running. Exiting...") Environment.Exit(2) End Select End Sub #End Region End Module