Windows Gezgini ile geliştirme

Windows Gezgini güçlü bir kaynak tarama ve yönetim uygulamasıdır. Windows Gezgini'ne Explorer.exe veya IExplorerBrowser arabirimi aracılığıyla tümleşik bir bütün olarak erişilebilir. Windows Gezgini (Explorer.exe), ShellExecuteEx veya benzer bir işlev kullanılarak ayrı bir işlem olarak oluşturulabilir.

Açık gezgin pencereleri IShellWindows(CLSID_ShellWindows)kullanılarak bulunabilir ve programlanabilir ve IWebBrowser2 (CLSID_ShellBrowserWindow) kullanılarak yeni Windows Gezgini örnekleri oluşturulabilir.

Aşağıdaki kod örneği, Windows Gezgini otomasyon modelinin çalışan gezgin pencerelerini oluşturmak ve bulmak için nasıl kullanılabileceğini gösterir.

#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;
}

Windows Gezgini istemci alanı, IExplorerBrowser arabirimi kullanılarak barındırılabilir. Windows Gezgini istemcisi ve ad alanı ağacı denetimleri, Windows Vista ve sonraki sürümlerin standart bileşenleridir. Geliştiriciler arabirimleri yapı bileşenleri olarak yeniden kullanabilir. Bu denetimlerin yaygın kullanımlarından biri, sorun etki alanına uygun özelleştirilmiş explorer'lar oluşturmaktır.

Windows Gezgini'ndeki denetimler aşağıdaki işlevsel kategorilere ayrılır:

Gezinti denetimleri, kullanıcıların bağlamı belirlemesine ve sayfa alanı olarak adlandırılan ilişkili mantıksal etki alanı alanında gezinmesine yardımcı olur. Örneğin, Windows Gezgini'nin arama alanı Shell ad alanıdır. Sayfa alanları sıfır veya daha fazla sayfadan oluşur.

Aşağıdaki tabloda, Windows Vista ve sonraki işletim sistemlerinde Windows Gezgini'nde kullanılabilen gezinti denetimleri listelenmiştir ve açıklanmaktadır.

Navigasyon kontrolü Açıklama
Adres Çubuğu (İçerik Haritası denetimi) Sayfa alanında geçerli sayfanın adresini görüntüler. Gezinti yolu düğmelerine tıklayarak sayfa alanındaki herhangi bir üst sayfaya gidebilirsiniz. Kullanıcılar gezinmek için URL'ler ve yollar da yazabilir.
Klasör Ağacı Ağaç denetiminin büyük sayfa alanları için iyileştirilmiş yeni bir sürümünü sağlar.
Seyahat Geri ve İletgibi web stili düğmelerde göreli gezintiyi etkinleştirir.
Başlık Geçerli dosya yöneticisinin adını ve bağlamını görüntüler.
Sayfa alanı Sayfa alanının mevcut dalını gösterir. Sayfalar farklı ölçütlere göre sıralanabilir. Kullanıcılar sayfaya gitmek için sayfaya tıklayabilir.

 

Komut Denetimleri

Komut denetimleri, Windows Gezgini'nin özelliklerini ve işlevselliğini kullanıcılara duyurur. Bu denetimler, seçilen bir öğeye veya öğeye özgü genel eylemleri veya eylemleri gerçekleştirir.

Komut denetimi Açıklama
Araç çubuğu Yaygın olarak kullanılan komutların (komut araç çubuğunun yeni bir sürümü) düğmelerini görüntüler. Özelleştirme seçenekleri arasında açılır düğmeler, bölünmüş düğmeler, isteğe bağlı açıklayıcı metin ve ekstra menü bulunur.
Kahraman Araç çubuğunun ortasında isteğe bağlı, özel, tek bir denetim olarak görünür. Geçerli bağlam için birincil komutu temsil eder.
Menü çubuğu Komutları menüler aracılığıyla sunar.
Bağlam Menüsü Bir öğeye sağ tıklamanın sonucu olarak görüntülenen kullanılabilir komutların bağlamsal olarak ilgili bir alt kümesini listeler.

 

Özellik ve Önizleme Denetimleri

Özellik ve önizleme denetimleri, öğeleri önizlemek ve öğe özelliklerini görüntülemek ve düzenlemek için kullanılır.

Kontrol Açıklama
Önizleme Seçili öğenin küçük resim veya Canlı Simge gibi bir önizlemesini görüntüler.
Özellikler Seçili öğenin özelliklerini görüntüler. Birden çok seçim için, seçili öğe grubu için özelliklerin özetini görüntüler. Null seçim için, geçerli sayfa (liste görünümü içeriği) için özelliklerin özetini görüntüler.

 

Filtreleme ve Görüntüleme Kontrolleri

Filtreleme ve görüntüleme denetimleri, liste görünümündeki öğe kümesini değiştirmek ve liste görünümündeki öğelerin sunularını değiştirmek için kullanılır.

Kontrol Açıklama
Filtre Liste görünümündeki öğeleri sütun olarak listelenen özelliklere göre filtreler veya düzenler. Bir sütuna tıklandığında bu özelliğe göre sıralanır.
Kelime çarkı Liste görünümünde görüntülenen öğeleri bir giriş metin dizesine göre dinamik ve artımlı olarak filtreler.
Görünüm Kullanıcının listview denetiminin görünüm modunu değiştirmesini sağlar. Simge boyutunu belirlemek için kaydırıcı kullanılabilir.

 

Listview kontrolü

Listview denetimi, dört görünüm modundan birinde bir öğe kümesini görüntülemek için kullanılır: ayrıntılar, kutucuklar, simgeler veya panorama. Listview denetimi, kullanıcının bir veya daha fazla öğeyi seçip etkinleştirmesine de olanak tanır.

Dikkat

Bu denetimlerden bazıları System.Windows.Controls ad alanında bulunan standart Windows Presentation Foundation (WPF) denetimlerine benzer adlara ve/veya işlevlere sahip olsa da, bunlar ayrı sınıflardır.

 

Bu ayrı denetimler, büyük ölçüde kullanıcı etkileşimi veya denetimlerin kendileri tarafından oluşturulan olaylar aracılığıyla birlikte çalışır. Aşağıdaki tabloda üç birincil olay kategorisi gösterilmektedir.

Olay kategorisi Örnek
Gezinme Bir sayfadan diğerine gitme.
Seleksiyon Liste görünümünde geçerli seçimi değiştirme.
Görünümü Değiştirme Liste görünümünde sunu sırasını veya görünüm modunu değiştirme.