无法终止仍在运行的 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();
但没有任何帮助,还有更多方法可以杀死它吗?如果是这样,如何杀死它?
首先导入 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");
我从很多人那里借来的,我不知道在哪里,但我感谢你们所有人,并给你们所有的功劳......很抱歉没有直接引用你,但这很有帮助。