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

C# 如果Microsoft Outlook已打开,如何使用C检查?,c#,outlook,email,C#,Outlook,Email,我试着寻找这个问题的答案。。。如果我忽略了,请原谅 我想做的是自动发送电子邮件。我在这段代码中有我想要的一切,但代码假定Outlook未打开 在Outlook打开另一个Outlook实例之前,是否有办法测试Outlook是否已打开 Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\microsoft\\wi

我试着寻找这个问题的答案。。。如果我忽略了,请原谅


我想做的是自动发送电子邮件。我在这段代码中有我想要的一切,但代码假定Outlook未打开

在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);

这里有一种方法可以测试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 */}
另一种方式可能是


因为我喜欢干净的一行纸,所以我使用了以下内容:

if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Any())
  return true;

代码假定Outlook未打开。您可以使用WMI->select*从win32_进程中选择并检查其中的name属性,如果找不到Outlook.exe,则可以打开它。另一种方式可能是为没有尽可能清楚而感到抱歉。我想说的是,这段代码会打开Outlook的一个实例,即使它已经打开了。我试图做的是在打开另一个实例之前测试Outlook是否已打开。@Piggie_Pie检查我发布的答案无需计数器,您只需执行processlist.length>0我使用了此的修改版本来获得我需要的结果。。。非常感谢。我没有足够的rep给你+rep。。。悲伤的一天:@Piggie\u Pie很高兴我能帮助你:@Piggie\u Pie-如果Irusu的答案满足你的问题,请接受并将其标记为已接受,这将比a+1更好。@Hambone-谢谢。。。我在这里还是新手,没有意识到我可以选中复选标记:问题解决了!干净的溶液很好。如果将大写字母从If编辑为小写,则复制/粘贴也可以:
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
}
if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Any())
  return true;