Как убить процесс, выполняемый оболочкой в ​​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, программа просмотра фотографий)

Другие вопросы по тегам