![](/img/trans.png)
[英]how to close outlook application from the AddIn of the outlook using c#?
[英]How to restart outlook (close then open outlook) with C# console app
我想每次打開控制台應用程序時重新啟動Outlook,我在PC服務器上部署此應用程序,因為沒有人會在假期時處理此問題。
為什么我要重啟outlook? 因為服務器PC中的Outlook會收到很多電子郵件,我們有應用程序可以獲取附件並每天下載。 但問題是有時候電子郵件被卡住了,我們必須重新啟動Outlook以獲得卡住的電子郵件。
我已經嘗試了一些代碼,並且對於process.start - >它可以打開outlook,但是我無法關閉重復的outlook(舊的)
namespace CloseOpenOutlook
{
class Program
{
static void Main(string[] args)
{
Process process = Process.GetCurrentProcess();
var dupl = Process.GetProcessesByName(process.ProcessName);
foreach (var p in dupl)
{
if (p.ProcessName == "OUTLOOK")
{
p.Kill();
}
}
Process myProcess = Process.Start("OUTLOOK");
}
}
}
預期結果=它將關閉舊的前景並打開新的前景
實際結果=它打開新的,而不是關閉舊的,所以它將是2個Outlook
我不知道它出了什么問題,已經從很多來源嘗試但仍然沒有工作
使用C#關閉Outlook有兩種主要方法。
1)終止進程,使用ProcessID 執行它 ,否則您將關閉所有Outlook實例:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetWindowThreadProcessId(HandleRef handle, out int processId);
private void OpenOutlookAndKillProcess()
{
int pid = -1;
//Get PID
outlookApp = new Outlook.Application();
HandleRef hwnd = new HandleRef(outlookApp, (IntPtr)outlookApp.Hwnd);
GetWindowThreadProcessId(hwnd, out pid);
.....
//Finally
KillProcess(pid,"OUTLOOK");
}
private void KillProcess(int pid, string processName)
{
System.Diagnostics.Process[] AllProcesses = System.Diagnostics.Process.GetProcessesByName(processName);
foreach (System.Diagnostics.Process process in AllProcesses)
{
if (process.Id == pid) process.Kill();
}
AllProcesses = null;
}
2)更好的方法是使用AutoReleaseComObject或原始的VSTO-Contrib,你可以在這里看到我的一個答案如何使用它: 關閉Excel工作簿 - System.Runtime.InteropServices.COMException:來自HRESULT的異常:0x800A03EC
這里解釋了你遇到的問題(它與Outlook的方式與Excel,Word,Powerpoint相同): 如何正確清理Excel互操作對象?
你可能會發現它更容易只是1)殺死進程,但更好的程序員將使用2) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.