2012-04-12 3 views
1

Следующая проблема сводит меня с ума. В C# я стараюсь, чтобы внешний вид отключился после запуска некоторого кода, чтобы захватить все события календаря, но независимо от того, что я пробовал, это не так. Может кто-нибудь мне помочь?C# Outlook Interop. Outlook не выключается

private void button1_Click(object sender, EventArgs e) 
{ 
    Microsoft.Office.Interop.Outlook.Application outlookApp = null; 
    Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace = null; 
    Microsoft.Office.Interop.Outlook.MAPIFolder CalendarFolder = null; 
    Microsoft.Office.Interop.Outlook.Items outlookCalendarItems = null; 

    outlookApp = new Microsoft.Office.Interop.Outlook.Application(); 
    mapiNamespace = outlookApp.GetNamespace("MAPI"); 

    CalendarFolder = mapiNamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar); 
    outlookCalendarItems = CalendarFolder.Items; 

    outlookCalendarItems.IncludeRecurrences = true; 
    foreach (Microsoft.Office.Interop.Outlook.AppointmentItem item in outlookCalendarItems) 
    { 
     if (item.IsRecurring) 
     { 
      Microsoft.Office.Interop.Outlook.RecurrencePattern rp = item.GetRecurrencePattern(); 
      DateTime first = new DateTime(2008, 8, 31, item.Start.Hour, item.Start.Minute, 0); 
      DateTime last = new DateTime(2008, 10, 1); 
      Microsoft.Office.Interop.Outlook.AppointmentItem recur = null; 

      for (DateTime cur = first; cur <= last; cur = cur.AddDays(1)) 
      { 
       try 
       { 
        recur = rp.GetOccurrence(cur); 
        MessageBox.Show(recur.Subject + " -> " + cur.ToLongDateString()); 
       } 
       catch 
       { 
       } 
      } 
     } 
     else 
     { 
      MessageBox.Show(item.Subject + " -> " + item.Start.ToLongDateString()); 
      break; 
     } 
    } 

    ((Microsoft.Office.Interop.Outlook._Application)outlookApp).Quit(); 
    //outlookApp.Quit(); 
    //(outlookApp as Microsoft.Office.Interop.Outlook._Application).Quit(); 

    outlookApp = null; 

    System.Runtime.InteropServices.Marshal.ReleaseComObject(outlookCalendarItems); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(CalendarFolder); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(mapiNamespace); 
    //System.Runtime.InteropServices.Marshal.ReleaseComObject(outlookApp); 

    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(outlookCalendarItems); 
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(CalendarFolder); 

    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(mapiNamespace); 
    //System.Runtime.InteropServices.Marshal.FinalReleaseComObject(outlookApp); 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 

    mapiNamespace = null; 
    CalendarFolder = null; 
    outlookCalendarItems = null; 
} 
+0

место Quit метод и RealeseComObject вызовы окончательно блокировать и посмотреть, если это нормально. – cookieMonster

+0

Просто попробовал, и это не сработало. – scadav

ответ

0

Временное хардкор решение:

public static class OutlookKiller 
{ 
     [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true, 
CharSet = CharSet.Unicode, ExactSpelling = true, 
CallingConvention = CallingConvention.StdCall)] 
    private static extern long GetWindowThreadProcessId(long hWnd, out long lpdwProcessId); 

    public static void Kill(ref Microsoft.Office.Interop.Outlook.Application app) 
    { 
     long processId = 0; 
     long appHwnd = (long)app.Hwnd; 

     GetWindowThreadProcessId(appHwnd, out processId); 

     Process prc = Process.GetProcessById((int)processId); 
     prc.Kill(); 
    } 
} 
+0

Спасибо ... Думаю, я поеду хардкор. – scadav

0

Вы отлаживали свой код, чтобы узнать, когда приложение когда-либо попадает в команду OutlookApp.Quit()?

Единственный способ обойти это - это разрушить процесс «Outlook.exe».

+0

Да. Я отлаживался, и он дошел до конца. Я подумал о том, что Crullley убил его, но не знал, как сказать, был ли процесс, который я убивал, «реальной» версией перспективы или версией моей программы. – scadav

+0

Когда вы запустите его, возьмите PID. Затем вы можете убить процесс с помощью PID. –