Я должен уничтожить процесс Windows Explorer (explorer.exe) для этого
позволяет говорят, что я использую собственный метод NT TerminateProcess
Это работает, но проблема состоит в том, что проводник запускается снова, могут быть окна, делает это, так или иначе. Когда я уничтожаю explorer.exe с диспетчером задач окон, он не возвращается, его уничтоженное пребывание.
Я хочу сделать независимо от того, что taskmanager делает через мое приложение.
Править:
Благодаря @sblom я решил его, быстрая тонкая настройка в реестре добилась цели. Хотя это - умный взлом, по-видимому, taskmnager имеет более чистый способ сделать это, однако, я решил пойти с путем @sblom на данный момент.
"Настоящее" решение. (Полная программа. Протестировано для работы в 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;
}
}
}
Что вам, вероятно, нужно сделать, так это вместо использования TerminateProcess отправить сообщение WM_QUIT в окна проводника и основной поток. Это немного сложно, но я нашел эту страницу, на которой есть пример кода, который может вам помочь:
http://www.replicator.org/node/100
Windows автоматически перезапустит explorer.exe после завершения процесса TerminateProcess так что он перезапускается в случае аварийного завершения.
Из Technet :
Вы можете установить раздел реестра HKLM \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ AutoRestartShell
на 0, и он больше не будет автоматически перезапускаться.