HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Egyedi böngészősáv létrehozása az IE-hez


Böngészősáv 1. rész

Példaprogram letöltése

3450 bájt

Most induló három részes sorozatunkban azzal foglalkozunk, hogy miként hozhatunk létre az Internet Explorer-hez saját böngészősávot, mely megjelenhet akár vízszintes irányban, mint a gyári eszköztárak, vagy akár függőlegesen is az IE bal oldalán, mint a Keresés, Kedvencek, Multimédia lapok. A saját magunk által létrehozott böngésző sáv nem más, mint egy kontrol, melyre tetszőleges más kontrolokat helyezhetünk és tetszőleges funkciókat valósíthatunk meg. A programunkból természetesen lehetőségünk van elérni az aktuális IE-t, melyet tudunk vezérelni, de elérhetjük az éppen megjelenített web oldalt is.

A megvalósítandó feladat viszonylag összetett és három jól elkülöníthető részre bontható:
  • szükségünk lesz jó néhány Windows interfész elérésére
  • készítenünk kell egy új kontrolt, melyet majd ősként fel tudunk használni egy-egy böngésző sáv elkészítésekor
  • létre kell hozunk egy böngésző sávot, egyedi funkciókkal felhasználva a már létrehozott ős osztályt
Ezt a három feladatot fogjuk a sorozatunk három részében tárgyalni. Mint mindig, most is majd a megvalósítás előkészítése igényli a legtöbb munkát, vagyis a sorozat első két részében lesz a legtöbb tennivaló. Ennek eredményeképp viszont nagyon könnyű lesz a dolgunk a jövőben minden olyan esetben, ha új böngészősávot szeretnénk létrehozni az IE-hez.
Nézzük, tehát milyen interfészekre, struktúrákra is lesz szükségünk:
GUID-ok
Szükségünk lesz majd a megvalósítás során két GUID számra, melyek az IWebBrowserApp és az IUnknown interfész azonosítják.
  public class ExplorerGUIDs
  {
    public static Guid IID_IWebBrowserApp = new Guid("{0002DF05-0000-0000-C000-000000000046}");
    public static Guid IID_IUnknown = new Guid("{00000000-0000-0000-C000-000000000046}");
  }
IObjectWithSite interfész
Az IObjectWithSite interfészt fogjuk majd felhasználni akkor, amikor a kapcsolatot létrehozzuk az IE-vel. A SetSite és GetSite metódusokon keresztül fogjuk megkapni a szükséges adatokat, illetve ezen keresztül tudjuk mi is átadni a szükséges információt az IE-nek. Az interfész eléréséhez meg kell adnunk egy attribútumban az IObjectWithSite GUID azonosítóját.
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")] 
  public interface IObjectWithSite
  {
    void SetSite([In, MarshalAs(UnmanagedType.IUnknown)] Object pUnkSite);
    void GetSite(ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out Object ppvSite);
  }
IOleWindow interfész
Az IOleWindow interfész gondoskodik arról, hogy az ablak azonosítóval rendelkező kontrolok és más alkalmazások közötti a kapcsolat létrejöjjön úgy, hogy egyik a másik területén jelenhessen meg, kezelve legyen a helyzet érzékeny súgó, stb.
Így például a GetWindow függvénynél kell megadnunk majd a kontrolunk ablak azonosítóját, míg a ContextSensitiveHelp függvénynél a helyzet érzékeny súgót hozhatjuk működésbe.
Az interfész eléréséhez meg kell adnunk egy attribútumban az IObjectWithSite GUID azonosítóját.
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000114-0000-0000-C000-000000000046")] 
  public interface IOleWindow
  {
    void GetWindow(out System.IntPtr phwnd);   
    void ContextSensitiveHelp([In] bool fEnterMode);
  }
IDockingWindow interfész
Az IDockingWindow interfész felhasználásával olyan kontrolt készíthetünk, mely képes lesz az Explorer keretén belül dokkolási műveletek elvégzésére. Többek közt értesülhetünk arról is, ha kontrolunk bezárásra kerül, vagy terület átméreteződik.
Az interfész eléréséhez meg kell adnunk egy attribútumban az IObjectWithSite GUID azonosítóját.
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("012dd920-7b26-11d0-8ca9-00a0c92dbfe8")] 
  public interface IDockingWindow
  {
    void GetWindow(out System.IntPtr phwnd);   
    void ContextSensitiveHelp([In] bool fEnterMode);
    void ShowDW([In] bool fShow);
    void CloseDW([In] UInt32  dwReserved);
    void ResizeBorderDW(IntPtr prcBorder, [In, MarshalAs(UnmanagedType.IUnknown)] Object punkToolbarSite, bool fReserved);
  } 
IDeskBand interfész
Böngésző sáv létrehozásához szükséges az IDeskBand interfész felhasználása is. A GetBandInfo függvénynél tudjuk majd megadni, hogy kontrol mekkora minimális, maximális mérettel rendelkezhet, valamint további speciális attribútumokat is itt adhatunk meg.
Az interfész eléréséhez meg kell adnunk egy attribútumban az IObjectWithSite GUID azonosítóját.
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("EB0FE172-1A3A-11D0-89B3-00A0C90A90AC")] 
  public interface IDeskBand
  {
    void GetWindow(out System.IntPtr phwnd);   
    void ContextSensitiveHelp([In] bool fEnterMode);
    void ShowDW([In] bool fShow);
    void CloseDW([In] UInt32  dwReserved);              
    void ResizeBorderDW(IntPtr prcBorder, [In, MarshalAs(UnmanagedType.IUnknown)] Object punkToolbarSite, bool fReserved);
    void GetBandInfo(UInt32 dwBandID, UInt32 dwViewMode, ref DESKBANDINFO pdbi);
  } 
IPersist interfész
IPersist interfész GetClassID függvényén keresztül adhatjuk meg objektumunk GUID azonosítóját. Az interfész eléréséhez meg kell adnunk egy attribútumban az IObjectWithSite GUID azonosítóját.
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("0000010c-0000-0000-C000-000000000046")]
  public interface IPersist
  {
    void GetClassID(out Guid pClassID);
  } 
IPersistStream interfész
Az IPersistStream interfészt felhasználva képesek leszünk egy adatfolyamba menti, betölteni az adatokat.
Az interfész eléréséhez meg kell adnunk egy attribútumban az IObjectWithSite GUID azonosítóját.
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000109-0000-0000-C000-000000000046")]
  public interface IPersistStream
  {
    void GetClassID(out Guid pClassID);
    void IsDirty ();                   
    void Load ([In, MarshalAs(UnmanagedType.Interface)] Object pStm);
    void Save ([In, MarshalAs(UnmanagedType.Interface)] Object pStm, [In] bool fClearDirty);
    void GetSizeMax ([Out] out UInt64 pcbSize);
  } 
_IServiceProvider interfész
Az IServiceProvider interfész fog gondoskodni arról, hogy GUID szám alapján tudjunk azonosítani szolgáltatásokat.
Az interfész eléréséhez meg kell adnunk egy attribútumban az IObjectWithSite GUID azonosítóját.
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
  public interface _IServiceProvider
  {
    void QueryService(ref Guid guid, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out Object Obj);
  } 
IInputObject interfész
A felhasználói inputok, illetve a gyorsbillentyűk kezelésében játszik majd szerepet az IInputObject interfész.
Az interfész eléréséhez meg kell adnunk egy attribútumban az IObjectWithSite GUID azonosítóját.
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("68284faa-6a48-11d0-8c78-00c04fd918b4")]
  public interface IInputObject
  {
    void UIActivateIO(Int32 fActivate, ref MSG  msg);
    [PreserveSig]
    Int32 HasFocusIO();
    [PreserveSig]
    Int32 TranslateAcceleratorIO(ref MSG msg);
  }
IInputObjectSite interfész
Hasonlóan az IInputObject interfészhez az IInputObjectSite interfész is a felhasználói input körül segédkezik, méghozzá a fókusz váltást tudjuk majd kezelni rajta keresztül.
Az interfész eléréséhez meg kell adnunk egy attribútumban az IObjectWithSite GUID azonosítóját.
  [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("f1db8392-7331-11d0-8c99-00a0c92dbfe8")]
  public interface IInputObjectSite
  {
    [PreserveSig]
    Int32 OnFocusChangeIS( [MarshalAs(UnmanagedType.IUnknown)] Object punkObj, Int32 fSetFocus);
  }
A folytatás
Sorozatunk második részében az itt megadott interfészek felhasználásával létrehozunk egy új kontrolt, melyet felhasználhatunk arra, hogy könnyedén létrehozzunk belőle egy új böngészősávot az IE-ben.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 397. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |