如果Microsoft Outlook已经打开,如何检查C#?

问题描述:

我试过寻找这个问题的答案......原谅我,如果我忽视了它。如果Microsoft Outlook已经打开,如何检查C#?

我想要做的是自动发送电子邮件。我在代码中拥有我想要的所有内容,但代码假定Outlook未打开。

有没有一种方法可以让我测试Outlook在打开Outlook的另一个实例之前是否已打开?

   Microsoft.Win32.RegistryKey key = 
      Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\microsoft\\windows\\currentversion\\app paths\\OUTLOOK.EXE"); 
      string path = (string)key.GetValue("Path"); 
      if (path != null) 
       System.Diagnostics.Process.Start("OUTLOOK.EXE"); 
      else 
       MessageBox.Show("There is no Outlook in this computer!", "SystemError", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
+0

“的代码假定Outlook未打开”

+0

您可以使用WMI - > select * from win32_process并检查名称属性,如果找不到outlook.exe,可以打开它。另一种方式可能是[Process.GetProcessesByName](https://msdn.microsoft.com/de-de/library/z3w4xdc9(v = vs.110).aspx) –

+0

对不起,不尽可能清晰。我想说的是,即使代码已经打开,此代码也会打开Outlook的一个实例。我想要做的是在打开另一个实例之前测试Outlook是否打开。 –

int procCount = 0; 
Process[] processlist = Process.GetProcessesByName("OUTLOOK"); 
foreach (Process theprocess in processlist) 
{ 
    procCount++;    
} 
if (procCount > 0) 
{ 
    //outlook is open 
} 
+0

不需要计数器,你可以做processlist.length> 0 –

+0

我用这个修改后的版本来得到我需要的结果......谢谢!我没有足够的代表给你+代表...悲伤的一天:( –

+0

@Piggie_Pie很高兴我可以帮你:) – Isuru

这里是你可以测试是否Outlook处于打开状态的一种方式,如果是,你“抢”当前实例。在您的catch块中,您可以按照列出的方式打开新实例:

Outlook.Application ol; 

try 
{ 
    ol = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application"); 
} 
catch (Exception ex) 
{ 
    // open your new instance 
} 

您可以使用Process类

Process[] localByName = Process.GetProcessesByName("outlook"); 
// empty array if no outlook process found. 
if(localByName.Length > 0) 
{ /*do work because outlook is already open*/} 
else 
{/* start outlook */} 

另一种方式可能是一个wql-query

WqlObjectQuery wqlQuery = new WqlObjectQuery("SELECT * FROM Win32_Process"); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wqlQuery); 

foreach (ManagementObject process in searcher.Get()) 
{ 
    var name = process.GetPropertyValue("Name"); // e.g. outlook.exe 
} 

using System.Diagnostics; //to make the Process work 

Process[ ] processlist = Process.GetProcessesByName 
("OUTLOOK:); 
If (processlist.Length>0) 
{ 
//outlook is open 
}