2017-09-10 29 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