本文轉自:https://coyee.com/article/10625-how-to-create-an-add-in-for-microsoft-outlookjavascript
Visual Studio Tool for Office(VSTO)加載項是.NET Framework中提供的工具集,可以讓咱們在(版本2003及更高版本)中擴展和自定義Microsoft Office產品。java
在本教程中,咱們將使用Outlook 2013做爲案例研究和Visual Studio 2015。數據庫
這是當您想建立Outlook加載項時的起點,瞭解這些對象的含義很重要。swift
Outlook對象模型:app
在下一節中,咱們將從這種類型的應用開始講解。編輯器
實際上,爲Visual Studio生成的項目佈局是很是直觀和簡單的。ide
主類是 ThisAddIn
,代碼以下所示:工具
public partial class ThisAddIn { private void ThisAddIn_Startup(object sender, System.EventArgs e) { } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { // Note: Outlook no longer raises this event. If you have code that // must run when Outlook shuts down, see // http://go.microsoft.com/fwlink/?LinkId=506785 } #region VSTO generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InternalStartup() { this.Startup += new System.EventHandler(ThisAddIn_Startup); this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); } #endregion }
這是一個很是簡單的類。 ThisAddIn_Startup方法是應用程序的起始點。 在這個方法中,咱們能夠獲得對象Application和模型的其餘對象。 此外,咱們能夠執行咱們的初始化過程,如配置和訪問數據庫。佈局
當用戶關閉Outlook時執行ThisAddIn_Shutdown方法。 但重要的是,在Outlook當前版本中,因爲性能問題,此方法沒有被調用。 可是,若是在Outlook關閉時須要執行某些代碼,則能夠檢查此連接以獲取其餘選項。visual-studio
接下來,咱們將會看到如何得到一些對象模型。所以,咱們須要使用必要的命名空間:
using Outlook = Microsoft.Office.Interop.Outlook;
代碼以下所示:
private void ThisAddIn_Startup(object sender, System.EventArgs e) { // Get the Application object Outlook.Application application = this.Application; // Get the Inspector object Outlook.Inspectors inspectors = application.Inspectors; // Get the active Inspector object Outlook.Inspector activeInspector = application.ActiveInspector(); if (activeInspector != null) { // Get the title of the active item when the Outlook start. MessageBox.Show("Active inspector: " + activeInspector.Caption); } // Get the Explorer objects Outlook.Explorers explorers = application.Explorers; // Get the active Explorer object Outlook.Explorer activeExplorer = application.ActiveExplorer(); if (activeExplorer != null) { // Get the title of the active folder when the Outlook start. MessageBox.Show("Active explorer: " + activeExplorer.Caption); } }
其餘對象模型能夠經過使用 Inspector
和 Explorer
對象來獲取。該操做一般基於事件,所以,須要註冊這兩個對象建立的事件。代碼大概是這樣的:
private void ThisAddIn_Startup(object sender, System.EventArgs e) { // ... // Add a new Inspector to the application inspectors.NewInspector += new Outlook.InspectorsEvents_NewInspectorEventHandler( Inspectors_AddTextToNewMail); }
Inspectors_AddTextToNewMail
是實現咱們功能的方法,以下所示:
void Inspectors_AddTextToNewMail(Outlook.Inspector inspector) { }
inspector參
數應當是對電子郵件或聯繫人的引用,具體取決於Outlook中的用戶操做。
在項目結束時,要從開發計算機上的Outlook中刪除加載項,請轉到Visual Studio中的生成(Build )菜單,而後單擊清除解決方案(Clean Solution)選項。
在Visual Studio中,轉到Build菜單/「Publish ...」。
備註:有時Visual Studio生成的安裝程序可能會在安裝在用戶計算機中時失敗,您應該會收到如下錯誤消息:
引用:
「不能解析屬性爲'類型'的值。錯誤:沒法加載文件或程序集…「。
在下一節中,咱們將展現一些關於如何爲Outlook 2013建立VSTO加載項的示例。
下面的示例是,用戶建立一封新的電子郵件時,咱們會在郵件的主題和正文中插入自定義文本。爲了完成這個任務,咱們須要在ThisAddIn_Startup
方法中註冊一個新的 Inspector
,當用戶建立或者打開郵件的時候,就會觸發調用Inspectors_AddTextToNewMail
方法。
private void ThisAddIn_Startup(object sender, System.EventArgs e) { // Get the Application object Outlook.Application application = this.Application; // Add a new Inspector inspectors.NewInspector += new Outlook.InspectorsEvents_NewInspectorEventHandler( Inspectors_AddTextToNewMail); } void Inspectors_AddTextToNewMail(Outlook.Inspector inspector) { // Get the current item for this Inspecto object and check if is type // of MailItem Outlook.MailItem mailItem = inspector.CurrentItem as Outlook.MailItem; if (mailItem != null) { if (mailItem.EntryID == null) { mailItem.Subject = "My subject text"; mailItem.Body = "My body text"; } } }
注意: 須要檢查 mailItem 對象是不是一種 MailItem
類,由於當這個事件被觸發時,經過 Outlook 的用戶操做,咱們並不知道哪一個Inspector
對象會被執行。
下面的示例是,在電子郵件發送時,容許咱們更新郵件裏的消息。這是一個很是有趣和適用的功能。有一些Outlook加載項能夠執行這種類型的操做,例如,防病毒軟件須要在郵件被髮送時包含簽名。
爲了完成這些功能,咱們將會在 ItemSend 事件中插入咱們的代碼。當一個郵件經過用戶或者計劃任務被髮送時,這個事件就會被觸發。
private void ThisAddIn_Startup(object sender, System.EventArgs e) { // Get the Application object Outlook.Application application = this.Application; // Subscribe to the ItemSend event, that it's triggered when an email is sent application.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler( ItemSend_BeforeSend); } void ItemSend_BeforeSend(object item, ref bool cancel) { Outlook.MailItem mailItem = (Outlook.MailItem) item; if (mailItem != null) { mailItem.Body += "Modified by GettingStartedOutlookAddIn"; } cancel = false; }
在下面的示例中,咱們將看到如何在Outlook中的功能區(工具欄)中添加控件。 具體來講,當用戶編輯或讀取電子郵件時,如何添加按鈕到功能區。
執行如下操做:
接下來就像開發 C# 桌面應用程序同樣,讓咱們編寫 ButtonDemo按鈕的OnClick事件來處理郵件消息。
private void buttonDemo_Click(object sender, RibbonControlEventArgs e) { // Get the Application object Outlook.Application application = Globals.ThisAddIn.Application; // Get the active Inspector object and check if is type of MailItem Outlook.Inspector inspector = application.ActiveInspector(); Outlook.MailItem mailItem = inspector.CurrentItem as Outlook.MailItem; if (mailItem != null) { MessageBox.Show("Subject: " + mailItem.Subject); } }
在下面的部分中,咱們將看到須要訪問其餘對象模型的示例。
將咱們的內容放置在上下文中,當咱們使用電子郵件正文時,咱們可使用Outlook對象執行一些功能,例如訪問MailItem對象的Body屬性。 可是,若是須要更多地控制電子郵件正文,則須要將其做爲Word文檔。 接下來,咱們將會看到一些例子。
首先,咱們將看到如何從「Outlook 2013和2016 VSTO加載項」中引用Word對象模型。 選擇您在Outlook應用程序中使用的相同版本以及選擇工具和實用程序的引用很是重要。
在個人案例中,我使用的是15.0.0.0 版本的Outlook。
所以,咱們將選擇相同版本的 Word 引用。
下面的示例是,一個含OnClick
事件的按鈕添加到Ribbon
(參見前面的章節 4.3. 如何添加一個控件到 Ribbon
工具欄)。
private void button2Demo_Click(object sender, RibbonControlEventArgs e) { // Get the Application object Outlook.Application application = Globals.ThisAddIn.Application; // Get the active Inspector object and check if is type of MailItem Outlook.Inspector inspector = application.ActiveInspector(); Outlook.MailItem mailItem = inspector.CurrentItem as Outlook.MailItem; if (mailItem != null) { Word.Document document = (Word.Document) inspector.WordEditor; string selectedText = document.Application.Selection.Text; MessageBox.Show(selectedText); } }
當用戶建立新的電子郵件時,會出現如下圖片。 在這裏,咱們能夠看到應用程序顯示一條消息,其中包含用戶已選擇並單擊「獲取文本選擇」按鈕的文本。
在下面的示例中,咱們將演示如何將咱們的應用程序訂閱到用戶經過電子郵件正文執行的事件。 具體來講,咱們將訂閱Word文檔中的事件(它表明電子郵件正文),當用戶對文本進行雙擊時,咱們將得到點擊完成時的單詞。
咱們將從應用程序入口點開始,咱們將建立一個Inspector對象來監視用戶什麼時候建立/編輯電子郵件。
private void ThisAddIn_Startup(object sender, System.EventArgs e) { // Get the Application object Outlook.Application application = this.Application; // Add a new Inspector inspectors.NewInspector += new Outlook.InspectorsEvents_NewInspectorEventHandler( Inspectors_RegisterEventWordDocument); }
使用這個Inspector,咱們在打開電子郵件編輯器時執行咱們的代碼。 此時,咱們將檢查Inspector對象是否爲MailItem。 接下來,咱們將檢查電子郵件編輯器是不是Word編輯器(有時是另外一種類型),最後咱們將獲取Word文檔對象。
void Inspectors_RegisterEventWordDocument(Outlook.Inspector inspector)
{
Outlook.MailItem mailItem = inspector.CurrentItem as Outlook.MailItem; if (mailItem != null) { // Check that the email editor is Word editor // Although "always" is a Word editor in Outlook 2013, it's best done perform this check if (inspector.EditorType == Outlook.OlEditorType.olEditorWord && inspector.IsWordMail()) { // Get the Word document Word.Document document = inspector.WordEditor; if (document != null) { // Subscribe to the BeforeDoubleClick event of the Word document document.Application.WindowBeforeDoubleClick += new Word.ApplicationEvents4_WindowBeforeDoubleClickEventHandler( ApplicationOnWindowBeforeDoubleClick); } } } }
接下來,咱們將訂閱咱們獲得的Word文檔的BeforeDoubleClick事件(在之前的代碼中),當觸發事件時,咱們將選擇用戶點擊的單詞。
private void ApplicationOnWindowBeforeDoubleClick(Word.Selection selection, ref bool cancel) { // Get the selected word Word.Words words = selection.Words; MessageBox.Show("Selection: " + words.First.Text); }
咱們能夠經過「選擇(selection)」對象訪問用戶選擇的單詞,它具備不少功能。 在咱們的示例中,使用Word屬性,咱們獲得用戶全部選定單詞的集合,第一個屬性是用戶點擊的位置。
當用戶建立新的電子郵件時,會出現如下圖片。 在這裏,咱們能夠看到應用程序顯示一個消息,其中包含用戶雙擊的文本。
能夠看出,使用VSTO加載項工具,咱們能夠經過多種方式輕鬆擴展Outlook功能。 在我看來,企業部門的這種應用有不少要求,能夠快速解決某些問題,比起其餘應用程序,一般辦公室用戶對微軟Office產品感到更滿意。 使用VSTO加載項,咱們能夠查詢數據庫以獲取員工的聯繫人,將產品列表包含在電子郵件中,同步企業應用程序與Outlook之間的約會等等。