我想每次打开控制台应用时都要重新启动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个Outlooks
我不知道在哪里出错,已经从许多来源尝试,但仍然无法正常工作
使用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(更好的方法是使用autorelealeasecomobject或原始的vsto -contrib,您可以在此处看到我的一个关于如何使用它的答案:关闭Excel Workbook -system.runtime.interime.interopservices.comexception.comexception.comexception.Comexception.Comexception:exception from hresult:0x800A03EC:0x800A03EC
在此处解释了您遇到的内容(与Excel,Word,PowerPoint相同的方式相关(:我如何正确清理Excel Interop对象?
您可能会发现它更容易 1(杀死该过程,但更好的程序员将使用 2(。