6

そのために、Windowsエクスプローラーのプロセス(explorer.exe)を強制終了する必要があります

ネイティブNTメソッドTerminateProcessを使用するとします

それは機能しますが、問題はエクスプローラーが再開することです。とにかく、Windowsがそれを実行している可能性があります。Windowsタスクマネージャーでexplorer.exeを強制終了すると、元に戻らず、強制終了されたままになります。

アプリケーションを介してタスクマネージャーが実行していることをすべて実行したいと思います。

編集:
@sblomのおかげで私はそれを解決し、レジストリをすばやく調整することでうまくいきました。それは巧妙なハックですが、どうやらtaskmnagerはそれを行うためのよりクリーンな方法を持っているようです、とは言っても、私は今のところ@sblomの方法を使うことにしました。

4

5 に答える 5

15

Technetから:

レジストリキーHKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoRestartShellを0に設定すると、自動再起動しなくなります。

于 2010-04-03T04:50:21.997 に答える
9

「本当の」解決策。(完全なプログラム。Windows 7 で動作することがテストされています。)

using System;
using System.Runtime.InteropServices;

namespace ExplorerZap
{
    class Program
    {
        [DllImport("user32.dll")]
        public static extern int FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll")]
        public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);

        static void Main(string[] args)
        {
            int hwnd;
            hwnd = FindWindow("Progman", null);
            PostMessage(hwnd, /*WM_QUIT*/ 0x12, 0, 0);
            return;
        }
    }
}
于 2010-04-03T05:48:17.077 に答える
5

この問題の別の解決策は次のとおりです。代わりに、APIはWindowsに付属の外部ツール(少なくともWin 7 Professional)を使用すると呼びます。

    public static class Extensions
    {
        public static void ForceKill(this Process process)
        {
            using (Process killer = new Process())
            {
                killer.StartInfo.FileName = "taskkill";
                killer.StartInfo.Arguments = string.Format("/f /PID {0}", process.Id);
                killer.StartInfo.CreateNoWindow = true;
                killer.StartInfo.UseShellExecute = false;
                killer.Start();
                killer.WaitForExit();
                if (killer.ExitCode != 0)
                {
                    throw new Win32Exception(killer.ExitCode);
                }
            }
        }
    }

Win32Exceptionが最良の例外ではない可能性があることは知っていますが、このメソッドは、実際にWindowsエクスプローラーを強制終了することを除いて、多かれ少なかれKillのように機能します。

拡張メソッドとして追加したので、Processオブジェクトで直接使用できます。

    foreach (Process process in Process.GetProcessesByName("explorer"))
    {
        process.ForceKill();
    }

最初に、taskkillツールが実稼働環境で使用可能であることを確認する必要があります(Windowsではしばらくの間使用されているようです:https ://web.archive.org/web/20171016213040/http://www.microsoft.com/resources /documentation/windows/xp/all/proddocs/en-us/taskkill.mspx?mfr=true)。

編集:元のリンクが無効になり、Internet ArchiveWaybackMachineのキャッシュに置き換えられました。Windows 2012/2016の更新されたドキュメントは、https ://docs.microsoft.com/en-us/windows-server/administration/windows-commands/taskkillにあります。

于 2012-10-21T17:02:55.710 に答える
2

おそらく、TerminateProcess を使用する代わりに、WM_QUIT メッセージをエクスプローラ ウィンドウとメイン スレッドにポストする必要があります。少し複雑ですが、参考になるコード例が記載されたこのページを見つけました。

http://www.replicator.org/node/100

Windows は、TerminateProcess の後に自動的に explorer.exe を再起動し、クラッシュ終了の場合に再起動します。

于 2010-04-03T05:23:17.250 に答える