2016-02-05 2 views
1

Я попытался найти ответ на этот вопрос ... Простите меня, если я упустил это.Как проверить с помощью C#, если Microsoft 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); 
+0

"код предполагает, что внешний вид не является открытым" <- что это значит? –

+0

Вы можете использовать WMI -> select * из win32_process и проверить там свойство name, если вы не можете найти outlook.exe, вы можете его открыть. другим способом может быть [Process.GetProcessesByName] (https://msdn.microsoft.com/de-de/library/z3w4xdc9 (v = vs.110) .aspx) –

+0

Жаль, что вы не настолько ясны, насколько это возможно. Я пытаюсь сказать, что этот код открывает экземпляр Outlook, даже если он уже открыт. То, что я пытаюсь сделать, это проверить, открыт ли Outlook перед открытием другого экземпляра. –

ответ

2
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

Я использовал модифицированную версию этого, чтобы получить результат, который мне нужен ... СПАСИБО !!! Мне не хватает репутации, чтобы дать вам + Rep ... sad day :( –

+0

@Piggie_Pie рад, что я мог бы вам помочь :) – Isuru

3

Вот один из способов вы можете проверить, если прогноз открыт, и если да, то вы «захватить» текущий экземпляр. В вашем блоке catch вы можете открыть свой новый экземпляр так, как вы указали:

Outlook.Application ol; 

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

Вы можете использовать класс 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 
} 
-1
using System.Diagnostics; //to make the Process work 

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