Megoldásként egy speciális projektet kell létrehoznunk, mely tartalmazza annak a programunknak az alapjait, amely képes lesz beépülni más alkalmazásba.
Ehhez válasszuk a File - New - Project menüpontot, majd a megjelenő ablakban az Other Projects - Extensibility Projects elemnél a Shared Add-in tételt jelöljük ki.
Ekkor elindul egy varázsló, melynél megadhatjuk az alapvető beállításokat a projektünkhöz. Az első ablaknál választhatjuk ki, hogy milyen nyelven szeretnénk írni a forráskódot, itt adjuk meg a „Create an Add-in using Visual C#”-ot.
A következő lapon azt jelölhetjük meg, hogy mely alkalmazásokhoz szeretnénk, ha modulunk képes lenne beépülni. Itt válasszuk most csak a Microsoft Word elemet.
Tovább lépve adhatunk nevet a beépülő modulunknak, valamint egy rövid leírást róla. Ezt követően állítsuk be az „I would like my Add-in to load when the host application loads.” jelölőnégyzetet, mellyel azt érjük el, hogy beépülő modulunk azonnal aktív lesz, amint az adott alkalmazás - jelen esetben a Word - elindul. Ezt a lépést kihagyva külön lépésben kellene aktivizálnunk a modult.
A varázsló ezt követően létrehoz két projektet. Az egyik lesz a beépülő modulunk, a másik pedig egy telepítő alkalmazás. Ha megírtuk a szükséges programunkat, akkor könnyen elkészíthetjük belőle a telepítő modult, melyet már vihetünk is a kliens gépére.
Először azonban lássuk mi is kell a programunkba.
Mivel a Word-öt szeretnénk kezelni, így biztos szükséges lesz egy referencia hozzáadása a projekthez a Word-ről. Válasszuk tehát a Project - Add Reference menüpontot, majd COM lapon a Microsoft Word elemet keressük elő.
A megvalósítandó feladat a következő legyen: hozzon létre a modulunk egy új nyomógombot a Word Standard palettáján Software Online felirattal. Ha a felhasználó e gombra kattint, akkor az aktuális Word dokumentum, aktuális kurzor pozíciójába kerüljön beszúrásra az aktuális dátum és időpont.
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)
{
A Word alkalmazás eléréséhez szükségünk lesz egy Word Application osztályra. Egy ilyen objektumot már kapott a modulunk az OnConnect függvény hívásakor, ahol ezt eltárolta az applicationObject változóba. Mivel ez object típusú, mert nem csak Word, hanem bármi más is, például Outlook is lehetne, így rá kell definiálnunk a Word.Application osztályt.
wa = (Word.Application)applicationObject;
A nyomógomb létrehozása lesz a következő feladat. Ehhez el kell érnünk azt a kollekciót, melyben az egyes paletták találhatók. Minden palettán tetszőleges számú gomb található, helyezhető el. Mi most a Standard-ot válasszuk saját gombunk elhelyezésére. A palettákat a CommandBars osztály kezeli, míg egy konkrét palettát a CommandBar osztályon keresztül érhetünk el.
string caption = "Software Online";
CommandBars cbs;
CommandBar cb;
Első lépésként lekérdezzük a Word alkalmazás CommandBars objektumát.
cbs = (CommandBars)applicationObject.GetType().InvokeMember("CommandBars", BindingFlags.GetProperty , null, applicationObject ,null);
Ezt követően kiválasztjuk a Standard palettát.
Megpróbáljuk elérni ezen a palettán a Software Online felirattal rendelkező gombot, ha még nincs ilyen, akkor hiba keletkezik és a catch részben fut tovább alkalmazásunk.
try
{
cbc = (CommandBarButton)cb.Controls[caption];
}
Ez esetben ha még nincs meg a gomb, akkor létrehozzuk azt. Ehhez a paletta Controls property-jének Add függvényét hívjuk, majd a létrejött objektumnak megadjuk gombunk feliratát és a stílusát nyomógomb stílusra válasszuk.
catch(Exception)
{
cbc = (CommandBarButton)cb.Controls.Add(1, m, m, m, m);
cbc.Caption = caption;
cbc.Style = MsoButtonStyle.msoButtonCaption;
}
Ezen a ponton a cbc változó már biztos, hogy tartalmazza a nyomógombunkat, akár most hoztuk létre, akár már létezett. Itt a láthatóságát igazra állítjuk és hozzárendelünk egy eseménykezelőt a Click eseményéhez, hogy a gombon történő kattintást a programunk kezelni tudja.
cbc.Visible = true;
cbc.Click += new _CommandBarButtonEvents_ClickEventHandler(Button_Click);
}
Ezzel a gomb adott, ha most rákattint a felhasználó, akkor a Button_Click nevű függvényünk kerül meghívásra. Itt nincs más dolgunk, mint az aktuális dokumentumba „begépelni” a dátumot és időpontot, majd egy enter-t „ütni” és ezzel a feladatot teljesítettük is.
private void Button_Click(CommandBarButton cmdBarbutton,ref bool cancel)
{
wa.Selection.TypeText(DateTime.Now.ToString());
wa.Selection.TypeParagraph();
}
Most az alkalmazásunk készen is van, fordítása előtt viszont tegyünk még egy beállítást: válasszuk a Solution Explorer-ben a projektünket, majd jobb gombbal kattintsunk és válasszuk Properties menüpontot. A megjelenő ablakban a Configuration Properties - Build elemnél a Register for COM interop opciót állítsuk igazra.
Ezzel azt érjük el, hogy a készített DLL a fordításkor automatikusan regisztrálva lesz a Windows regisztrációs adatbázisában.
Most fordítsuk le a programunkat és készítsük el a telepítő csomagot, majd futtassuk azt. 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 standard palettáján már ott kell lennie az új nyomógombnak is.
Gond eseté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\MSWordAddin.Connect
LoadBehavior 3