C# - Beépülő menü készítése Word alkalmazáshoz

forráskód letöltése
Cikkünkben az Office alkalmazáscsomag elemeihez létrehozható beépülő modulok (Add-in) világába kalandozunk. A .NET Framework segítségével ilyen modulokat minden eddiginél egyszerűbben készíthetünk. A mellékelt példában egy olyan modult készítünk el, mely a Word alkalmazás indulásakor betöltődik, és egy új menüpontot hoz létre a menüsorban, egy almenüvel.
A mellékelt példa használata előtt fordítsa le a forráskódot, majd a MenuAddinSetup projekt MenuAddinSetup.msi állományának elindításával telepítse a modult. Ezt követően indítsa el a Word alkalmazást.
Az elkészítendő modul tehát egy beépülő menü, amely egy almenüponttal rendelkezik. A menüpontra kattintva megnyitunk egy saját készítésű dialógus ablakot, melyben megjelennek az Outlook alkalmazásunk Névjegyalbumában megtalálható bejegyzések.
Beépülő modul
A beépülő modulok készítését a Visual Studio.NET-ben külön projekttípussal végezhetjük el. A típus az OTHER PROJECTS kategóriában, ezen belül is az EXTENSIBILITY PROJECTS alkategóriában található, neve Shared Add-in.
A létrehozást varázsló segíti. A létrehozott projektben egy Connect.cs állományban helyezhetjük el a menü létrehozásának kódját. A projekt mellett automatikusan generálódik egy telepítő projekt is, mely segíti a modul elhelyezését a COM komponensek közt, és elvégzi a szükséges regisztrációs bejegyzéseket.
A beépülő menü létrehozásához el kell helyeznünk egy referenciát a Microsoft.Office.Core névtérre, mert ebben találhatók a menüobjektumok deklarációi, valamint egy hivatkozást a Word alkalmazás komponensére, hogy el tudjuk érni a célalkalmazást.
A menüsor újabb pontjai CommandBarPopup típusú elemek, míg a menü alpontjainak típusa CommandBarButton.
A Connect osztályban deklarálunk mindkét típusból egyet, hiszen egy alpontot fogunk a menüben megjeleníteni. Szükségünk van továbbá egy példányra a Word alkalmazásból is.
public Microsoft.Office.Core.CommandBarPopup menuMain;
public Microsoft.Office.Core.CommandBarButton menuItem;
private Word.Application wa;
A menü felirata „Beépülő menü”, míg az alpont felirata „Outlook felhasználói” lesznek. A megvalósításhoz a következő lépéseket kell tennünk az OnStartupComplete függvénynél, mely akkor kerül meghívásra, amikor a Word már elindult és a modulunk betöltése után már létrejött a kapcsolat a két alkalmazás között.
public void OnStartupComplete(ref System.Array custom)
{
  CreateMenu();
}
A művelet elvégzését a CreateMenu metódusba ágyaztuk. Ehhez el kell érnünk azt a kollekciót, melyben az egyes objektumcsoportok találhatók. A kollekciókat a CommandBars osztály kezeli. Első lépés a metódusban, hogy példányosítjuk a Word.Application objektumot.
wa = (Word.Application)applicationObject;
Majd egy TRY-CATCH blokkban ellenőrizzük, hogy a létrehozandó menü nem jött-e létre már korábban, egy másik betöltődéskor.
try
{
menuMain = (Microsoft.Office.Core.CommandBarPopup)wa.CommandBars["Menu Bar"].Controls[mainText];
menuItem = (Microsoft.Office.Core.CommandBarButton)menuMain.Controls[itemText];
}
Ha nem jött létre, akkor a hivatkozás a menüpontra hibát eredményez, és a CATCH blokkban létrehozzuk azt. A CommandBars kollekcióból kiválasztjuk a menüsort („Menu Bar” hivatkozással), majd a Controls listába felvesszük az új menüpontot.
catch
{
  menuMain = (Microsoft.Office.Core.CommandBarPopup)wa.CommandBars["Menu Bar"].Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlPopup,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
  menuMain.Caption = mainText;
A menüpont alpontja esetében is ezt tesszük, csak itt már a létrehozott menüpont Controls gyűjteményéhez adjuk az elemet.
  menuItem = (Microsoft.Office.Core.CommandBarButton)menuMain.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
  menuItem.Caption = itemText;
  ...
}
A lekérdezés, vagy létrehozás után a kód egy közös pontban folytatódhat. Itt beállítjuk a menüpont láthatóságát, majd megadjuk a gombra kattintás eseménykezelőjét.
menuMain.Visible = true;
menuItem.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(Button_Click);
A kezelőfüggvénynek speciális paraméterlistával kell rendelkeznie, az első paraméterben kérdezhető le a küldő menüpont.
private void Button_Click(Microsoft.Office.Core.CommandBarButton cmdBarbutton,ref bool cancel)
{
A gomb segítségével egyszerűen példányosítjuk a másik projektben elkészített űrlapunk osztályát, majd megjelenítjük azt. A Form ListBox kontrolja tartalmazza az Outlook névjegyalbumában található neveket, és azok e-mail címét.
  Form1 f = new Form1();
  f.ShowDialog();
A Form osztálya rendelkezik egy nyilvános taggal, mely a választott elem értékét tartalmazza, így a Form bezárása után is lekérdezhetjük értékét. Ha ez nem üres karakterlánc, vagyis történt választás, akkor beszúrjuk a karakterláncot a Word dokumentum aktuális kurzorpozíciójába.
  if (f.entry != "")
  {
    wa.Selection.TypeText(f.entry);
    wa.Selection.TypeParagraph();  
  }
  ...
Megjelenő ablak projektje
A Form kódjában el kell érnünk az Outlook alkalmazásunkat. Példányosítjuk az Outlook Application osztályát.
Outlook.Application oa = new Outlook.Application();
A MAPI névtérből kiválasztjuk a névjegyalbum bejegyzéseit tartalmazó mappát.
Outlook.NameSpace on = oa.GetNamespace("MAPI");
Outlook.MAPIFolder mf = on.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts);
Szükségünk van egy ContactItem objektumra is, hogy az egyes bejegyzések információit kinyerhessük.
Outlook.ContactItem ci = null;
Lekérdezzük a bejegyzéseket, majd az egyes névjegy-objektumok FullName és Email1Address property-jét elhelyezzük a ListBox kontrol egy sorában.
for (int i=1; i<=mf.Items.Count;i++)
{
  ci = (Outlook.ContactItem)mf.Items.Item(i);
  listBox1.Items.Add(ci.FullName + " " + ci.Email1Address);
}
A COM modulunk telepítése után ellenőrizzük, hogy a telepítő beállította-e a Windows regisztrációs adatbázisába az alábbi kulcsot és értéket:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Word\Addins\MenuAddin.Connect
LoadBehavior 3
A telepítő futása után jelentkezzünk ki a rendszerből és újra be, majd ha ezt követően indítjuk a Word-öt, akkor a menüsorban már ott kell lennie az új menüpontnak is.