Ikonok, előnézetek és helyi menük hozzáadása

Annak érdekében, hogy az adatok indexelve és megfelelően jelenjenek meg a felhasználó számára a keresések során, implementálnia kell a Shell-adattárakat (más néven Shell-névtérbővítményeket), valamint a fájltípus-kezelőket (más néven Shell-bővítményeket, bővítménykezelőketvagy Shell-bővítménykezelőket).

Ez a témakör a következő felületeket ismerteti:

Fájltípus-kezelők implementálása

Ezek a Shell-bővítmények vagy fájltípus-kezelők a következő Shell-funkciókat biztosítják a felhasználóknak:

  • Az eredménynézet egy adott ikont jelenít meg az elemtípushoz.
  • Az eredménynézet az elem előnézetét jeleníti meg, amikor a felhasználó kiválasztja az elemet.
  • A felhasználók duplán kattintva eseményeket kezdeményezhetnek, például megnyithatják a fájlt.
  • A felhasználók a jobb gombbal az elemekre kattintva elérhetik a helyi (kontextus) menüt.
  • A felhasználók húzással helyezhetik el az elemeket.

Az összes com-objektumhoz hasonlóan a fájltípus-kezelőknek is implementálniuk kell egy IUnknown felületet és egy osztály-előállítót.

Windows XP vagy korábbi rendszerekben a kezelőknek a következőket is implementálniuk kell:

Windows Vista rendszerben IPersistFile interface és IShellExtInit Interface a Következő három felület váltotta fel a Shellhez a kezelő inicializálásához:

Az ésszerű felhasználói élmény biztosításához meg kell adnia egy Shell-adattárat a protokollkezelőnek. Ez az adattár ezután az ikonkezelők, a helyi menükezelők, az előnézeti kezelők és így tovább "gyáraként" szolgál. A IPersist Interface és a IPersistFolder Interface minimális implementációit a IShellFolder Interfacemegköveteli, és az IShellFolder Interface minimális implementációjára van szükség az IContextMenu és az IExtractIconesetében.

Jegyzet

Ugyanazt az osztályazonosítót (CLSID) kell implementálni IPersist, IPersistFolder, és IShellFolder.

 

További információ a Shell-adattár protokollkezelők támogatásához való létrehozásáról: Az alapszintű mappaobjektum-felületek implementálása.

IPersist

Az IPersist felület határozza meg a GetClassID egyetlen metódust, amely egy olyan objektum CLSID-jének megadására szolgál, amely tartósan tárolható a rendszerben.

Módszer Leírás
GetClassID A Shell-adattár objektum CLSID azonosítóját adja vissza

 

IPersistFolder

Az IPersistFolder felület a Shell-mappaobjektumok inicializálására szolgál. Ennek a felületnek, amely a IPersist-ból származik, az implementálása az, ahogyan a mappa helyét megadják a Rendszerhéj névterében. Ezt a felületet ne használja közvetlenül. A IShellFolder::BindToObject metódus fájlrendszeri implementációja akkor használatos, amikor inicializál egy Shell-mappa objektumot.

Módszer Leírás
Inicializál Utasít egy Shell-mappaobjektumot, hogy inicializálja magát az átadott információk alapján, és visszaadja S_OK

 

IShellFolder

A IShellFolder interface felület a mappák kezelésére szolgál, és részleges implementációra van szükség, hogy a protokollkezelőhöz implementált ikonok és környezetfelületek megfelelően viselkedjenek a Windows Search találatok felhasználói felületén. A szükséges funkciók többsége a GetUIObjectOf metódus által érhető el. Ezzel a módszerrel egy bővítmény lekérdezheti az IExtractIcon és IContextMenu interfészeket.

Az IShellFolder interface felület URL-címek helyett PIDL-eket használ. A teljes Shell-adattár követelményeivel ellentétben a bővítmények olyan egyszerű IDL-struktúrát használhatnak, amely csak az URL-címet tartalmazza.

Az IShellFolder Interface alábbi módszereit kell implementálnia. Ezen módszerek közül öt minimális implementációt igényel.

Módszer Leírás
BindToObject Visszatér E_NOTIMPL
BindToStorage Visszatér E_NOTIMPL
CreateViewObject Visszatér E_NOTIMPL
ÁllítsaBeANevét Visszatér E_NOTIMPL
ParseDisplayName URL-cím konvertálása a PIDL-struktúrára
Azonosítók összehasonlítása Két PIDL-érték összehasonlítása
GetDisplayNameOf A PIDL URL-címét adja vissza
GetUIObjectOf Ez az eljárás hasonló a IUnknown::QueryInterface metódushoz. Ha ikont kér, a hívó az IID_IExtractIcon-t kér; ha helyi menüt kér, a hívó az IID_IContextMenu-t kér.

 

IShellFolder nem használható mappák számbavételére. Ez azt jelenti, hogy a mappa megjelenítendő neve a fizikai URL-cím lesz. Ez a jövőben változhat.

IContextMenu

Amikor a Windows Search megjeleníti az eredményeket a felhasználónak, a felhasználó rákattinthat a jobb gombbal egy elemre, és megtekintheti a IContextMenu felület által meghatározott helyi menüt. A gyorsmenüket helyi menüknek is nevezik.

A helyi menü alapértelmezett művelete ugyanaz, mint amikor az elemre duplán kattint. Az elem megfelelő IShellFolder vagy IContextMenu illesztője nélkül a dupla kattintásos esemény alapértelmezett viselkedése az, hogy argumentumként adja át az URL-címet a ShellExecute függvény függvénynek.

A helyi menükezelők létrehozásával kapcsolatos további információkért tekintse meg Helyi menükezelők létrehozása című témakört, és Minta: A protokollkezelők rendszerhéjkiterjesztései a mintakódhoz.

IExtractIcon

IExtractIcon lekéri a Windows Search felhasználói felületének ikonját a protokollkezelő által megadott PIDL URL-cím alapján.

További információkért az ikonkezelők létrehozásáról, lásd a Ikonkezelők létrehozása szakaszt, a mintakódért pedig a Rendszerhéjkiterjesztések protokollkezelőkhöz szakaszt.

IPreviewHandler

Az IPreviewHandler egy kijelölt elem részletes előnézetét jeleníti meg a Windows Intézőben. Az előzetes verziók a Windows Search 4.0-s verziójában, illetve a Windows Vista és a Windows Desktop Search 3.x rendszerben érhetők el.

Egyéni előnézeti kezelő létrehozása:

  1. Implementáljon egy IPreviewHandler-t, amely egy IStream-etfogad, követve a(z) Előnézeti kezelőkre vonatkozó útmutatót.

  2. Regisztrálja be az előnézet kezelőt:

    HKEY_CLASSES_ROOT\<Your_Object_Type>
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}
       @ = {<Your_PreviewHandler_GUID>}
    
  3. Hajtsa végre az alábbi két lépést egy Shell-mappa url-címhez való implementálásához:

    1. A IShellFolder::GetUIObjectOf metódusesetén kezelje a IQueryAssociations elemet, és adja vissza a társítást a Shell-objektumokhoz, amint az az alábbi kódrészletben látható.

      CComPtr<IQueryAssociations> spqa;
      AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa);
      spqa->Init(0, L"Your_Object_Type", NULL, NULL);
      spqa->QueryInterface(riid, ppvReturn);
      
    2. Miután a Shell lekérdezte a Shell-mappát az adatfolyam előnézeti kezelő inicializálásához, lépjen a IShellFolder::BindToObject metódushoz, kezelje az IID_IStream-et, és adjon vissza egy IStream-et az URL-címére.

Ha egy meglévő előzetes verziókezelőt szeretne újra felhasználni a fájltípushoz, kövesse az alábbi két lépést:

  1. Regisztrálja az előnézeti kezelőt a fájltípushoz a meglévő előnézeti kezelő CLSID-azonosítójának használatával a <Your_PreviewHandler_GUID>helyett.
  2. Implementáljon egy Shell-mappát.

További információ az előzetes verzió kezelőinek létrehozásáról: IPreviewHandler és Előzetes kezelők.

További erőforrások

fogalmi

Protokollkezelők fejlesztése

Protokollkezelők ismertetése

Változások indexének értesítése

kódminta: A Protokollkezelők rendszerhéjbővítményei

Protokollkezelők telepítése és regisztrálása

Keresési összekötő létrehozása egy protokollkezelőhöz

hibakeresési protokollkezelők