无法终止仍在运行的 Outlook 实例

本文关键字:Outlook 实例 运行 终止 | 更新日期: 2023-09-27 18:30:18

我正在尝试杀死一个仍在运行的 Outlook 实例(在我的应用程序中使用而不是 Outlook 本身),我在解构器中调用以下内容

        //_app = Microsoft.Office.Interop.Outlook.Application
        _app.Quit();
        Marshal.FinalReleaseComObject(_app);
        Marshal.FinalReleaseComObject(_app.Session);
        GC.WaitForPendingFinalizers();
        GC.Collect();

但没有任何帮助,还有更多方法可以杀死它吗?如果是这样,如何杀死它?

无法终止仍在运行的 Outlook 实例

首先导入 user32.dll 以便能够使用 GetWindowThreadProcessId

然后 Kill 方法通过参数接收 Outlook 应用程序并获取进程并杀死它

public static class OutlookKiller
{
        [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
    private static extern long GetWindowThreadProcessId(long hWnd, out long lpdwProcessId);
    public static void Kill(ref Microsoft.Office.Interop.Outlook.Application app)
    {
        long processId = 0;
        long appHwnd = (long)app.Hwnd;
        GetWindowThreadProcessId(appHwnd, out processId);
        Process prc = Process.GetProcessById((int)processId);
        prc.Kill();
    }
}

这是"杀死"我(请原谅双关语),但最终挖掘出来,这是一个按名称杀死进程的解决方案。我的目标是展望...但它应该通过引用 PID 适用于任何和应用程序,它将杀死所述应用程序的所有实例。例如,如果您有 5 个记事本实例,它将杀死所有实例......我还没有看到有人找到这个名字,然后在同一个帖子中杀死这个过程,所以你来了。

using System.Management;
using System.Diagnostics;

public static class KillProcessByPID
{
    public static void KillProcessByName(string ProcessName)
    {
        string OutlookProcessName = "";
        foreach (Process otlk in Process.GetProcesses())
        {
            if (otlk.ProcessName.ToLower().Contains(ProcessName.ToLower())) //OUTLOOK is the one I am seeking - yours may vary
            {
                OutlookProcessName = otlk.ProcessName;
            }
        }
        //Get process ID by Name
        var processes = Process.GetProcessesByName(OutlookProcessName);
        foreach (var process in processes)
        {
            Console.WriteLine("PID={0}", process.Id);
            Console.WriteLine("Process Handle={0}", process.Handle);
            KillProcessAndChildren(process.Id);
        }
    }
    /// <summary>
    /// Kill a process, and all of its children, grandchildren, etc.
    /// </summary>
    /// <param name="pid">Process ID.</param>
    public static void KillProcessAndChildren(int pid)
    {
        //Process[] remoteByName = Process.GetProcessesByName("notepad", "myComputer");
        // Cannot close 'system idle process'.
        if (pid == 0)
        {
            return;
        }
        ManagementObjectSearcher searcher = new ManagementObjectSearcher
                ("Select * From Win32_Process Where ParentProcessID=" + pid);
        ManagementObjectCollection moc = searcher.Get();
        foreach (ManagementObject mo in moc)
        {
            KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
        }
        try
        {
            Process proc = Process.GetProcessById(pid);
            proc.Kill();
        }
        catch (ArgumentException)
        {
            // Process already exited.
        }
    }
}

我在应用程序的开头和结尾使用以下一行 Killer 代码调用它:

    KillProcessByPID.KillProcessByName("OUTLOOK");

我从很多人那里借来的,我不知道在哪里,但我感谢你们所有人,并给你们所有的功劳......很抱歉没有直接引用你,但这很有帮助。