2017-09-10 33 views
-1

我編寫了一個程序,它可以同步我的Outlook日曆。目前爲止,這個程序效果很好。但是,如果Outlook崩潰或重新啓動,我的程序確實需要再次觸發「ThisAddin_Startup()」以鏈接到新的Outlook實例。我試圖通過監視正在運行的進程來解決這個問題。但之後它不再工作。如果我在循環中調用「Process.GetProcessesByName」,它就沒有任何作用,它的評論,然後它的工作。GetProcessesByName在Outlook中停止我的事件

有誰知道爲什麼?

bool monitoring = false; 
while (true) 
{ 
    if (!monitoring) //Start monitoring or restart monitoring 
    { 
     Debug.WriteLine("start"); 
     ThisAddIn_Startup(); 
     monitoring = true; 
    } 
    Process[] outlook; 
    outlook = Process.GetProcessesByName("blabla"); 
    Thread.Sleep(1000); 
} 


private void ThisAddIn_Startup() 
{ 
    _OutlookApplication = new Outlook.Application(); 

    //Link Inbodx Events 
    _olFolderInbox.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Item_Calendar_Change); 

    //Link Calendar Events 
    _olFolderCalendar.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Item_Calendar_Add); 
    _olFolderCalendar.Items.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(Item_Calendar_Change); 
    _olFolderCalendar.Items.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(Item_Calendar_Deleted); 
} 

編輯: 簡體孔代碼仍然沒有什麼作品:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

using Outlook = Microsoft.Office.Interop.Outlook; 
using System.Diagnostics; 
using System.Threading; 
using System.ComponentModel; 

namespace OAddIn 
{ 
    public partial class Form1 : Form 
    { 
     Outlook.Application _OutlookApplication; 
     Outlook.MAPIFolder _olFolderInbox; 
     Outlook.MAPIFolder _olFolderCalendar; 
     Outlook.MAPIFolder _olFolderCalendar_AddOnCalendar; 
     Outlook.MAPIFolder _olFolderDeletedItems; 

     public Form1() 
     { 
      InitializeComponent(); 

      Thread osThread = new Thread(ThisAddIn_Startup); 
      osThread.Start(); 

      Thread osThread2 = new Thread(CheckIfProcessIsRunning); 
      osThread2.Start(); 
     } 

     private void ThisAddIn_Startup() 
     { 
      _OutlookApplication = new Outlook.Application(); 
      InitCalendars(); 
      InitMailBox(); 

      Debug.WriteLine("Start Now Monitoring"); 

      //Link Inbodx Events 
      _olFolderInbox.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Item_Calendar_Change); 

      //Link Calendar Events 
      _olFolderCalendar.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Item_Calendar_Add); 
      _olFolderCalendar.Items.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(Item_Calendar_Change); 
      _olFolderCalendar.Items.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(Item_Calendar_Deleted); 

     } 

     void CheckIfProcessIsRunning() 
     { 
      while (true) 
      { 

       int returnValue = 0; 
       Process[] o = Process.GetProcessesByName("OUTLOOK"); 

       Debug.WriteLine("FSSFSSGSFSFSFSFSFSF: " + returnValue); 
       Thread.Sleep(3000); 
      } 
     } 

     private void InitCalendars() 
     { 
      Outlook.MAPIFolder calendars = (Outlook.MAPIFolder)_OutlookApplication.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar); 
      try 
      { 
       _olFolderCalendar_AddOnCalendar = calendars.Folders["AddOnCalendar"]; //AddOn calendar 
      } 
      catch 
      { 
       _olFolderCalendar_AddOnCalendar = calendars.Folders.Add("AddOnCalendar"); 
      } 
      _olFolderCalendar = calendars; //Standard calendar 
     } 

     private void InitMailBox() 
     { 
      _olFolderInbox = (Outlook.MAPIFolder)_OutlookApplication.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
      _olFolderDeletedItems = (Outlook.MAPIFolder)_OutlookApplication.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderDeletedItems); 
     } 


     void Item_Calendar_Add(object item) 
     { 
      Debug.WriteLine(""); 
      Debug.WriteLine("------ Item_Calendar_Add() ----------------------------------------------"); 
      PrintImportantInfo(item); 

     } 

     public void Item_Calendar_Change(object item) 
     { 
      Debug.WriteLine(""); 
      Debug.WriteLine("------ Item_Calendar_Change() ----------------------------------------------"); 
      PrintImportantInfo(item); 


     } 

     void Item_Calendar_Deleted() 
     { 
      Debug.WriteLine(""); 
      Debug.WriteLine("------ Item_Calendar_Deleted() ---------------------------------------------"); 
      object item = _olFolderDeletedItems.Items.GetLast(); 
      PrintImportantInfo(item); 


     } 

     void PrintImportantInfo(object item) 
     { 
      try 
      { 


       Outlook.AppointmentItem appointment = item as Outlook.AppointmentItem; 
       if (appointment != null) 
       { 
        Debug.WriteLine("APPOINTMENTINFO_________________________________________________________"); 
        Debug.WriteLine(" A_Subject: " + appointment.Subject.ToString()); 
        Debug.WriteLine(" A_MeetingStatus: " + appointment.MeetingStatus.ToString()); 
        Debug.WriteLine(" A_ResponseStatus: " + appointment.ResponseStatus.ToString()); 
        Debug.WriteLine(" A_GlobalAppointmentID: " + appointment.GlobalAppointmentID.ToString()); 
        Debug.WriteLine(" A_Time: " + appointment.Start.ToString() + " - " + appointment.End.ToString()); 
        Debug.WriteLine(" A_Organizer: " + appointment.GetOrganizer().Address.ToString()); 
        Debug.WriteLine(" A_Organizer: " + appointment.Organizer); 
        if (appointment.Location != null) 
         Debug.WriteLine(" A_Location: " + appointment.Location.ToString()); 
       } 
       Outlook.MeetingItem meeting = item as Outlook.MeetingItem; 
       if (meeting != null) 
       { 
        Debug.WriteLine("MEETINGINFO_____________________________________________________________"); 

        Debug.WriteLine(" M_Subject: " + meeting.Subject.ToString()); 
        Debug.WriteLine(" M_MessageClass: " + meeting.MessageClass.ToString()); 
        Debug.WriteLine(" M_SenderEmailAddress: " + meeting.SenderEmailAddress.ToString()); 
        appointment = meeting.GetAssociatedAppointment(false); 
        if (appointment != null) 
        { 
         Debug.WriteLine("APPOINTMENTINFO_________________________________________________________"); 
         appointment.Save(); 
         Debug.WriteLine(" A_Subject: " + appointment.Subject.ToString()); 
         Debug.WriteLine(" A_MeetingStatus: " + appointment.MeetingStatus.ToString()); 
         Debug.WriteLine(" A_ResponseStatus: " + appointment.ResponseStatus.ToString()); 
         Debug.WriteLine(" A_GlobalAppointmentID: " + appointment.GlobalAppointmentID.ToString()); 
         Debug.WriteLine(" A_Time: " + appointment.Start.ToString() + " - " + appointment.End.ToString()); 
         Debug.WriteLine(" A_Organizer: " + appointment.GetOrganizer().Address.ToString()); 
         Debug.WriteLine(" A_Organizer: " + appointment.Organizer.ToString()); 
         if (appointment.Location != null) 
          Debug.WriteLine(" A_Location: " + appointment.Location.ToString()); 
        } 
       } 
      } 
      catch { } 
     } 


    } 
} 

回答

1

您是否嘗試過單獨的線程中做的每一個動作?

bool monitoring = false; 
while (true) 
{ 
    if (!monitoring) //Start monitoring or restart monitoring 
    { 
     Debug.WriteLine("start"); 
     ThisAddIn_Startup(); 
     monitoring = true; 
    } 
    Process[] outlook; 
    new Thread(() => { 
    outlook = Process.GetProcessesByName("blabla"); 
    }.Start(); 
    Thread.Sleep(1000); 
} 


private void ThisAddIn_Startup() 
{ 
    _OutlookApplication = new Outlook.Application(); 

    //Link Inbodx Events 
    _olFolderInbox.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Item_Calendar_Change); 

    //Link Calendar Events 
    _olFolderCalendar.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Item_Calendar_Add); 
    _olFolderCalendar.Items.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(Item_Calendar_Change); 
    _olFolderCalendar.Items.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(Item_Calendar_Deleted); 
} 
+0

是的我試過了,但沒有奏效。我只是不明白這可能會如何影響這? – user3077796

+0

因爲他們都分享相同因此必須等待另一個完成之前繼續 –

+0

對不起,我卡住了。我在EDIT中發佈了上面的洞(簡體)代碼。什麼是相同的? – user3077796