2011-11-16 33 views
0

好吧,這是有點一個棘手的...「讀」事件的MailItem 2007 VSTO VB.NET

我編程的加載項的MS Outlook 2007,使用VS 2010和VSTO和VB.NET。我的目標是提示用戶打印他們從某些電子郵件地址收到的電子郵件。 (這將通過一個簡單的MsgBox完成。)

具體來說,我想提示用戶何時完成閱讀電子郵件。我的觀點是它應該與Outlook中的「讀取收據」功能類似。 (你知道,那些煩人的事... 「發件人請求表明您已經閱讀這封電子郵件等等等等收據」

因此,用戶讀取電子郵件,然後當他們去關閉督察(或者如果它們處於資源管理器視圖中,則將焦點更改爲不同的項目),彈出MsgBox。我注意到這個時間與電子郵件變成「讀取」時相符。

我一直在整個谷歌和MSDN和教程的網站幾天追這個,這裏就是我發現:

回合1: 的的MailItem對象有未讀的屬性,它也有一個PropertyChange事件。我可以在收件箱中的每個Mailitem上爲PropertyChange使用AddHandler,將它們綁定到一個檢查PropertyChange事件參數的單個子例程中,以確保它是UnRead。似乎相當可行,除了PropertyChange沒有傳遞調用對象的身份,所以我無法知道收件箱中的電子郵件剛剛失去「未讀」狀態。

事實上,沒有一個Mailitem事件似乎通過它們的身份,可能是因爲某人(我猜)我們假設你有一個直接指向Mailitem對象的指針。所以這條路線似乎不起作用。

回合2: 我可以抓住所有的Mailitems的收件箱中到一個集合,然後限制他們只是未讀的。

Dim inbox As Outlook.MAPIFolder = Nothing 
Dim WithEvents unreadItems As Outlook.Items 

inbox = Me.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) 
unreadItems = inbox.Items.Restrict("[Unread]=true") 

由於unreadItems被變灰WITHEVENTS,我可以寫一個小組以處理unreadItems.ItemRemove,這將很好地工作。但是ItemRemove事件沒有對象參數!衛生署!

回合3: 比方說,我做相反的:我得到的收件箱內容,並限制[未讀] = FALSE,然後使用.ItemAdd事件。這在一定程度上會起作用,不同之處在於理論上只要用戶從任何文件夾將「[Unread] = false」項目轉儲到收件箱中,而不是從收件箱中的Unread到Read組中進行更改。所以,除非我在這裏誤解了一些東西,也不是一種選擇。

回合4: 現在,這是我又想到了被簡單地調暗收件箱中的物品收集WITHEVENTS並打算關閉.ItemChange事件,但這一事件並沒有真正說明什麼改變了一下對象,所以沒有骰子。


最後,我很困惑這一點。我非常接近從我的目標中退縮。蹩腳的選擇是在用戶收到來自指定地址之一的電子郵件時提醒用戶(因爲我相信Application.NewMail事件不會給我帶來任何麻煩)。但是,我將不得不提醒用戶 - 我不會提示他們打印他們還沒有閱讀過的電子郵件。

這種替代方法是不可取的,我想我會提出我的問題進行檢查和建議。

-Matt

P.S.我來自使用Objective-C製作iPad應用程序,在那裏我自己構建大部分對象層次結構......要處理具有此類限制的COM對象是很奇怪的。

回答

3

我不太清楚你希望你的用戶界面行爲如何,因爲當用戶完成讀取他們的電子郵件時,並不十分清楚。一種看待它的方式是,它們在他們看過它時完成,這意味着檢查員窗口顯示了郵件,並且用戶正在切換到另一個窗口。爲了解決這個問題,你可能最好從觀察員那裏觀看事件,而不是郵件。 另一種看待它的方式是,只要標記爲「已讀」,就會讀取郵件。請注意,用戶可能實際上關閉了將項目標記爲自動讀取的選項!這可以在工具 - 做 - >選項 - >其他>閱讀窗格中,像這樣:

enter image description here

而且,用戶可以選擇的項目並將其標記爲手動讀取,所以你需要思考什麼你想在這種情況下做。

如果你想監視MailItem的「read」屬性的變化,你在第1輪非常接近。你需要添加的東西是你不應該把你所有的處理程序綁定到一個子程序在單個對象實例中。相反,你可以創建自己的類,像這樣(C#代碼):

class ItemWatcher 
{ 
    // The Outlook mailitem to watch for 
    private Microsoft.Office.Interop.Outlook.MailItem itemBeingWatched = null; 

    public ItemWatcher(Microsoft.Office.Interop.Outlook.MailItem item, Form1 parentForm) 
    { 
     itemBeingWatched = item; 
     itemBeingWatched.PropertyChange += new Microsoft.Office.Interop.Outlook.ItemEvents_10_PropertyChangeEventHandler(itemBeingWatched_PropertyChange); 
    } 

    void itemBeingWatched_PropertyChange(string Name) 
    { 
     // Respond to property <Name> in the object itemBeingWatched having changed 
    } 
} 

然後你需要創建ItemWatcher類的集合,並設置他們看你的電子郵件。
請注意,當新郵件到達或舊郵件被刪除/移動時,您還需要監視需要添加/刪除收看項目的項目。

+0

非常好。實際上,我想我應該想到這一點。一個問題:如果有人關閉該選項,甚至有可能達到相同的效果(因此,即使他們看到它們,所有電子郵件仍然保持閱讀狀態)。我想知道如何配置Outlook時讀取回執功能的行爲。我必須檢查一下。無論哪種方式,你基本上解決了我的問題! –