2016-02-05 2 views
1

J'ai essayé de trouver la réponse à cette question ... Pardonnez-moi si je l'ai oublié. Ce que j'essaye de faire est d'automatiser l'envoi d'un email.Comment vérifier avec C# si Microsoft Outlook est déjà ouvert?

J'ai tout ce que je veux dans ce code, mais le code suppose que Outlook n'est pas ouvert.

Existe-t-il un moyen pour moi de tester si Outlook est ouvert avant d'ouvrir une autre instance d'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

"le code suppose que Outlook est pas ouvert" <- qu'est-ce que cela signifie? –

+0

Vous pouvez utiliser WMI -> select * de win32_process et vérifier la propriété name, si vous ne trouvez pas outlook.exe, vous pouvez l'ouvrir. un autre moyen pourrait être [Process.GetProcessesByName] (https://msdn.microsoft.com/de-de/library/z3w4xdc9 (v = vs.110) .aspx) –

+0

Désolé de ne pas être aussi clair que possible. Ce que j'essaie de dire, c'est que ce code ouvre une instance d'Outlook même si elle est déjà ouverte. Ce que j'essaie de faire est de tester pour voir si Outlook est ouvert avant d'ouvrir une autre instance. –

Répondre

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

Pas besoin de compteur, vous pouvez simplement faire processlist.length> 0 –

+0

J'ai utilisé une version modifiée de ceci pour obtenir le résultat dont j'avais besoin ... MERCI !!! Je n'ai pas assez de rep pour vous donner + Rep ... triste jour :( –

+0

@Piggie_Pie heureux que je puisse vous aider :) – Isuru

3

Voici une façon que vous pouvez tester si Outlook est ouvert, et si elle est, vous « saisir » l'instance actuelle. Dans votre bloc catch, vous pouvez ouvrir votre nouvelle instance comme vous l'avez indiqué:

Outlook.Application ol; 

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

Vous pouvez utiliser la classe de processus par ex.

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 */} 

une autre façon pourrait être un 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 
}