Как убить процесс, выполняемый оболочкой в C#
Я хочу отобразить tiff-файл с помощью оболочки. Я предполагаю, что приложением по умолчанию является программа просмотра фотографий. Моя проблема в том, что когда я хочу убить процесс с помощью photoviewer.Kill(), я получаю System.InvalidOperationException. При установке точки останова после photoViewer.Start() я понял, что программа просмотра фотографий не содержит идентификатора. Есть ли способ убить его? Поскольку он запускается через dllhost.exe, я не хочу перезапускать все процессы с именем dllhost и убивать их все, так как я не знаю, что еще запускает dllhost.
Process photoViewer = new Process();
private void StartProcessUsingShellExecute(string filePath)
{
photoViewer.StartInfo = new ProcessStartInfo(filePath);
photoViewer.StartInfo.UseShellExecute = true;
photoViewer.Start();
}
У меня есть другой подход без выполнения оболочки, но этот подход, похоже, имеет проблемы с dpi. Подход без оболочки выполнить
1 ответ
Нашел решение, может поможет кому с подобной проблемой. Когда я заглянул в диспетчер задач, я обнаружил, что программа просмотра фотографий Windows 10 работает отдельно от приложения через dllhost. Итак, поскольку у меня запущено и запущено 4 процесса dllhost, я просто хочу закрыть окно. Я делаю:
private void StartProcessAsShellExecute(string filePath)
{
photoViewer.StartInfo = new ProcessStartInfo(filePath);
photoViewer.StartInfo.UseShellExecute = true;
photoViewer.Start();
Process[] processes = Process.GetProcessesByName("dllhost");
foreach (Process p in processes)
{
IntPtr windowHandle = p.MainWindowHandle;
CloseWindow(windowHandle);
// do something with windowHandle
}
viewerOpen = true;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
//I'd double check this constant, just in case
static uint WM_CLOSE = 0x10;
public void CloseWindow(IntPtr hWindow)
{
SendMessage(hWindow, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
}
который закрывает все окна dllhost (из которых у меня только 1, программа просмотра фотографий)