Condividi tramite


Sviluppo con Microsoft Windows Explorer

Esplora risorse di Windows è un potente applicativo per l'esplorazione e la gestione delle risorse. È possibile accedere a Esplora risorse come un insieme integrato tramite Explorer.exe o l'interfaccia IExplorerBrowser. Esplora risorse (Explorer.exe) può essere generato come processo separato usando ShellExecuteEx o una funzione simile.

È possibile individuare e programmare le finestre di Esplora risorse usando IShellWindows (CLSID_ShellWindows) e è possibile creare nuove istanze di Esplora risorse usando IWebBrowser2 (CLSID_ShellBrowserWindow).

L'esempio di codice seguente illustra come usare il modello di automazione di Esplora risorse per creare e individuare le finestre di esplorazione in esecuzione.

#define _WIN32_WINNT 0x0600
#define _WIN32_IE 0x0700
#define _UNICODE

#include <windows.h>
#include <shobjidl.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <strsafe.h>
#include <propvarutil.h>
 
#pragma comment(lib, "shlwapi.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "propsys.lib")
 
// Use the Shell Windows object to find all of the explorer and IExplorer 
// windows and close them.
 
void CloseExplorerWindows()
{
    IShellWindows* psw;
    
    if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, 
                                   NULL,  
                                   CLSCTX_LOCAL_SERVER, 
                                   IID_PPV_ARGS(&psw))))
    {
        VARIANT v = { VT_I4 };
        if (SUCCEEDED(psw->get_Count(&v.lVal)))
        {
            // Walk backward to make sure that the windows that close
            // do not cause the array to be reordered.
            while (--v.lVal >= 0)
            {
                IDispatch *pdisp;
                
                if (S_OK == psw->Item(v, &pdisp))
                {
                    IWebBrowser2 *pwb;
                    if (SUCCEEDED(pdisp->QueryInterface(IID_PPV_ARGS(&pwb))))
                    {
                        pwb->Quit();
                        pwb->Release();
                    }
                    pdisp->Release();
                }
            }
        }
        psw->Release();
    }
}
 
// Convert an IShellItem or IDataObject into a VARIANT that holds an IDList
// suitable for use with IWebBrowser2::Navigate2.
 
HRESULT InitVariantFromObject(IUnknown *punk, VARIANT *pvar)
{
    VariantInit(pvar);
 
    PIDLIST_ABSOLUTE pidl;
    HRESULT hr = SHGetIDListFromObject(punk, &pidl);
    if (SUCCEEDED(hr))
    {
        hr = InitVariantFromBuffer(pidl, ILGetSize(pidl), pvar);
        CoTaskMemFree(pidl);
    }
    return hr;
}
 
HRESULT ParseItemAsVariant(PCWSTR pszItem, IBindCtx *pbc, VARIANT *pvar)
{
    VariantInit(pvar);
 
    IShellItem *psi;
    HRESULT hr = SHCreateItemFromParsingName(pszItem, NULL, IID_PPV_ARGS(&psi));
    if (SUCCEEDED(hr))
    {
        hr = InitVariantFromObject(psi, pvar);
        psi->Release();
    }
    return hr;
}

HRESULT GetKnownFolderAsVariant(REFKNOWNFOLDERID kfid, VARIANT *pvar)
{
    VariantInit(pvar);
 
    PIDLIST_ABSOLUTE pidl;
    HRESULT hr = SHGetKnownFolderIDList(kfid, 0, NULL, &pidl);
    if (SUCCEEDED(hr))
    {
        hr = InitVariantFromBuffer(pidl, ILGetSize(pidl), pvar);
        CoTaskMemFree(pidl);
    }
    return hr;
}

HRESULT GetShellItemFromCommandLine(REFIID riid, void **ppv)
{
    *ppv = NULL;
    HRESULT hr = E_FAIL;

    int cArgs;
    PWSTR *ppszCmd = CommandLineToArgvW(GetCommandLineW(), &cArgs);
    if (ppszCmd && cArgs > 1)
    {
        WCHAR szSpec[MAX_PATH];
        StringCchCopyW(szSpec, ARRAYSIZE(szSpec), ppszCmd[1]);
        PathUnquoteSpacesW(szSpec);

        hr = szSpec[0] ? S_OK : E_FAIL;   // Protect against empty data
        if (SUCCEEDED(hr))
        {
            hr = SHCreateItemFromParsingName(szSpec, NULL, riid, ppv);
            if (FAILED(hr))
            {
                WCHAR szFolder[MAX_PATH];
                GetCurrentDirectoryW(ARRAYSIZE(szFolder), szFolder);

                hr = PathAppendW(szFolder, szSpec) ? S_OK : E_FAIL;
                if (SUCCEEDED(hr))
                {
                    hr = SHCreateItemFromParsingName(szFolder, NULL, riid, ppv);
                }
            }
        }
    }
    return hr;
}

HRESULT GetShellItemFromCommandLineAsVariant(VARIANT *pvar)
{
    VariantInit(pvar);

    IShellItem *psi;
    HRESULT hr = GetShellItemFromCommandLine(IID_PPV_ARGS(&psi));
    if (SUCCEEDED(hr))
    {
        hr = InitVariantFromObject(psi, pvar);
        psi->Release();
    }
    return hr;
}

void OpenWindow()
{
    IWebBrowser2 *pwb;
    HRESULT hr = CoCreateInstance(CLSID_ShellBrowserWindow, 
                                  NULL,
                                  CLSCTX_LOCAL_SERVER, 
                                  IID_PPV_ARGS(&pwb));
    if (SUCCEEDED(hr))
    {
        CoAllowSetForegroundWindow(pwb, 0);

        pwb->put_Left(100);
        pwb->put_Top(100);
        pwb->put_Height(600);
        pwb->put_Width(800);
 
        VARIANT varTarget = {0};
        hr = GetShellItemFromCommandLineAsVariant(&varTarget);
        if (FAILED(hr))
        {
            hr = GetKnownFolderAsVariant(FOLDERID_UsersFiles, &varTarget);
        }

        if (SUCCEEDED(hr))
        {
            VARIANT vEmpty = {0};
            hr = pwb->Navigate2(&varTarget, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
            if (SUCCEEDED(hr))
            {
                pwb->put_Visible(VARIANT_TRUE);
            }
            VariantClear(&varTarget);
        }
        pwb->Release();
    }
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED |  COINIT_DISABLE_OLE1DDE);
    if (SUCCEEDED(hr))
    {
        CloseExplorerWindows();

        OpenWindow();

        CoUninitialize();
    }
    return 0;
}

L'area client di Esplora risorse può essere ospitata usando l'interfaccia IExplorerBrowser. Il client di Esplora Risorse di Windows e i controlli della struttura ad albero dello spazio dei nomi sono componenti standard di Windows Vista e versioni successive. Gli sviluppatori possono riutilizzare le interfacce come componenti di compilazione. Un uso comune di questi controlli consiste nel creare esploratori personalizzati adatti al dominio del problema.

I controlli in Esplora risorse sono classificati nelle categorie funzionali seguenti:

I controlli di spostamento aiutano gli utenti a determinare il contesto e a spostarsi nello spazio di dominio logico associato, denominato spazio di pagina. Ad esempio, lo spazio di pagina per Esplora File è lo spazio dei nomi shell. Gli spazi di pagina sono costituiti da zero o più pagine.

La tabella seguente elenca e descrive i controlli di spostamento disponibili in Esplora risorse in Windows Vista e nei sistemi operativi successivi.

Controllo di navigazione Descrizione
Barra degli indirizzi (controllo Breadcrumb) Visualizza l'indirizzo della pagina corrente nello spazio di pagina. Puoi cliccare sui pulsanti delle briciole di pane per navigare verso qualsiasi pagina nello spazio delle pagine. Gli utenti possono anche digitare URL e percorsi da esplorare.
Albero delle cartelle Fornisce una nuova versione di un controllo albero, ottimizzata per spazi di paging di grandi dimensioni.
Viaggio Abilita lo spostamento relativo tramite pulsanti in stile Web, ad esempio Indietro e Avanti.
Titolo Visualizza il nome e il contesto correnti di Explorer.
Spazio di pagina Visualizza il ramo corrente dello spazio delle pagine. Le pagine possono essere ordinate in base a criteri diversi. Gli utenti possono cliccare su una pagina per navigarvi.

 

Controlli dei comandi

I controlli dei comandi pubblicizzano agli utenti le caratteristiche e le funzionalità di Esplora Risorse. Questi controlli eseguono azioni o azioni generali specifiche di un elemento o di un elemento selezionato.

Controllo dei comandi Descrizione
Barra degli strumenti Visualizza i pulsanti per i comandi di uso comune (una nuova versione di una barra degli strumenti dei comandi). Le opzioni di personalizzazione includono pulsanti a discesa, pulsanti suddivisi, testo descrittivo facoltativo e un'area eccedente.
Eroe Viene visualizzato come un singolo controllo personalizzato facoltativo al centro della barra degli strumenti. Rappresenta il comando primario per il contesto corrente.
Barra dei menu Presenta i comandi tramite i menu.
Menu di scelta rapida Elenca un sottoinsieme contestuale di comandi disponibili che vengono visualizzati in seguito al clic con il pulsante destro del mouse su un elemento.

 

Controlli delle proprietà e dell'anteprima

I controlli proprietà e anteprima vengono usati per visualizzare in anteprima gli elementi e per visualizzare e modificare le proprietà degli elementi.

Controllo Descrizione
Anteprima Visualizza un'anteprima dell'elemento selezionato, ad esempio un'anteprima o un'icona dinamica.
Proprietà Visualizza le proprietà dell'elemento selezionato. Per più selezioni, viene visualizzato un riepilogo delle proprietà per il gruppo selezionato di elementi. Per una selezione Null, viene visualizzato un riepilogo delle proprietà per la pagina corrente (contenuto della visualizzazione elenco).

 

Filtri e controlli di visualizzazione

I controlli di filtro e visualizzazione vengono usati per modificare il set di elementi nella visualizzazione elenco e per modificare la presentazione degli elementi nella visualizzazione elenco.

Controllo Descrizione
Filtro Filtra o dispone gli elementi in una visualizzazione elenco in base alle proprietà elencate come colonne. Facendo clic su una colonna viene ordinato in base a tale proprietà.
Wordwheel Filtra in modo dinamico e incrementale gli elementi visualizzati in una visualizzazione elenco in base a una stringa di testo di input.
Visualizza Consente all'utente di modificare la modalità di visualizzazione di un controllo listview. È possibile usare un dispositivo di scorrimento per determinare le dimensioni dell'icona.

 

Controllo Listview

Il controllo listview viene usato per visualizzare un set di elementi in una delle quattro modalità di visualizzazione: dettagli, riquadri, icone o panorama. Il controllo listview consente inoltre all'utente di selezionare e attivare uno o più elementi.

Cautela

Sebbene alcuni di questi controlli abbiano nomi e/o funzionalità simili ai controlli Windows Presentation Foundation (WPF) standard presenti nello spazio dei nomi System.Windows.Controls, sono classi distinte.

 

Questi controlli separati interagiscono in gran parte tramite eventi generati dall'interazione dell'utente o dai controlli stessi. La tabella seguente illustra le tre categorie di eventi principali.

Categoria di eventi Esempio
Navigazione Passando da una pagina a un'altra.
Selezione Modifica della selezione corrente nella visualizzazione elenco.
Visualizza modifica Modifica dell'ordine di presentazione o della modalità di visualizzazione nella visualizzazione elenco.