質問

ようにwindowsシェルの拡張子があり、残念ながらの変更時におけるDLLを見ながら再起動windows explorer以降ではDLLにいたしました。

このプログラムからのディーノ*エスポジートが、うまくいきませんでした。

void SHShellRestart(void)
{
    HWND hwnd;
    hwnd = FindWindow("Progman", NULL );
    PostMessage(hwnd, WM_QUIT, 0, 0 );
    ShellExecute(NULL, NULL, "explorer.exe", NULL, NULL, SW_SHOW );
    return;
}

はずもない。

P.S.を実現できたらいいのに行くタスクマネージャーを死なせてしまうexplorerの過程で、だいたいで怠け者です。また、これにより自動化を実現しております。

P.P.Sを使用しています。NETのための開発がシェルの再起動機能がC、C++やす純ます。まだ小規模で実行形式にまとめたものです。

役に立ちましたか?

解決

フールプルーフソリューション:

foreach (Process p in Process.GetProcesses())
{
    // In case we get Access Denied
    try
    {
        if (p.MainModule.FileName.ToLower().EndsWith(":\\windows\\explorer.exe"))
        {
            p.Kill();
            break;
        }
    }
    catch
    { }
}
Process.Start("explorer.exe");

他のヒント

以前の回答の一部を解析し、研究のビットを行った後、私はC#で少し完全な例を作成しました。これは、それが完全にシャットダウンし、それを再開するのを待ち、その後、エクスプローラのシェルを閉じます。これは、このスレッドで興味深い情報がたくさんあります、お役に立てば幸いです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;

namespace RestartExplorer
{
class Program
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool PostMessage(IntPtr hWnd, [MarshalAs(UnmanagedType.U4)] uint Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    const int WM_USER = 0x0400; //http://msdn.microsoft.com/en-us/library/windows/desktop/ms644931(v=vs.85).aspx

    static void Main(string[] args)
    {
        try
        {
            var ptr = FindWindow("Shell_TrayWnd", null);
            Console.WriteLine("INIT PTR: {0}", ptr.ToInt32());
            PostMessage(ptr, WM_USER + 436, (IntPtr)0, (IntPtr)0);

            do
            {
                ptr = FindWindow("Shell_TrayWnd", null);
                Console.WriteLine("PTR: {0}", ptr.ToInt32());

                if (ptr.ToInt32() == 0)
                {
                    Console.WriteLine("Success. Breaking out of loop.");
                    break;
                }

                Thread.Sleep(1000);
            } while (true);
        }
        catch (Exception ex)
        {
            Console.WriteLine("{0} {1}", ex.Message, ex.StackTrace);
        }
        Console.WriteLine("Restarting the shell.");
        string explorer = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), "explorer.exe");
        Process process = new Process();           
        process.StartInfo.FileName = explorer;
        process.StartInfo.UseShellExecute = true;
        process.Start();

        Console.ReadLine();

    }
}
}

私は、誰もそれだけでエクスプローラウィンドウを開くのではなく、シェルとして起動のexplorer.exeの問題に対処していない気づきました。これを理解するために私にしばらく時間がかかった、それは単純なものだったが判明します:

string explorer = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), "explorer.exe");
        Process process = new Process();
        process.StartInfo.FileName = explorer;
        process.StartInfo.UseShellExecute = true;
        process.Start();

あなたはそれがシェルとして再起動するために取得する場合はtrueとしてStartInfo.UseshellExecuteを設定する必要があります。

のFindWindowはGetWindowThreadProcessIdを使用した後、次いでOpenProcess、その後のTerminateProcess。

いくつかのより多くのグーグルの後、私は次のC#ソリューションを思い付います:


using System.Diagnostics;
...
static public void RestartExplorer()
{
    foreach(Process p in Process.GetProcesses())  {
       if(p.MainModule.ModuleName.contains("explorer") == true)
         p.Kill();
    }
    Process.Start("explorer.exe");
}

これはVista上で私の作品ます:

DWORD dwPID;
HANDLE hExp;
HWND hSysTray = ::FindWindow (TEXT("Shell_TrayWnd"), NULL) ;
GetWindowThreadProcessId (hSysTray, &dwPID);
hExp = OpenProcess (PROCESS_TERMINATE, FALSE, dwPID);

if (hExp)
{
   TerminateProcess (hExp, 0);
}
Sleep (2000);
ShellExecute (NULL, NULL, TEXT("explorer.exe"), NULL, NULL, SW_HIDE);

しかし、私は(私は、それゆえSW_HIDEを試してみました)を開く探るウィンドウを抑制するためにどのような方法を見つけることができません。 Vistaでは、パラメータを指定せずにexplorer.exeを実行すると、以前のシステムに「explorer.exeの/ e」を実行するのと同じであると思われます。あなたが、私はここにそれを持っていない、XP上で自分自身でそれをしようとする必要があります。

注:極端なように見えるんのTerminateProcessを使用しますが、エクスプローラにWM_CLOSEを投稿は、Windowsのシャットダウン]ダイアログボックスを誘発

これはWindows7/8(および必要な試験のなかでも動作します詳細

以降 が適切な方法でありExplorer (progmanに含まれたWindows7&8- 右クリック タスクバー(Shell_TrayWndにWin8はStartMenuにWin7) を押しながらCtrl-Shift, でのポップアップメニュー 隠しオプションがありExplorer, は、掘削を使ってスパイ++で実行するメッセージ WM_USER+436.

いいたしまして、以下の作品です。

PostMessage(FindWindow('Shell_TrayWnd'),nil),WM_USER+436,0,0);

でExplorerを閉じ、すべての開う場合がございます。を再開しexplorerをご利用方法を提供する。

なので、 をご確認ください にコメントがこの作品32bit/64bit版のwindows vista/7/8またはずです。

「右」エクスプローラのプロセスが殺されることを、より確実性を提供し、

C#ソリューションます。

using System;
using System.Diagnostics;

...............

public static void RestartExplorer()
 {
 const string explorer = "explorer.exe";
 string explorerPath = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), explorer);
 foreach (Process process in Process.GetProcesses())
  {
  // In case we get Access Denied
  try
   {
   if (string.Compare(process.MainModule.FileName, explorerPath, StringComparison.OrdinalIgnoreCase) == 0)
    {
    process.Kill();
    }
   }
  catch
   {
   }
  }
 Process.Start(explorer);
 }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top