次の方法で共有


Windows エクスプローラー を使用した開発

Windows エクスプローラーは、強力なリソース閲覧および管理アプリケーションです。 Windows エクスプローラーは、Explorer.exeまたは IExplorerBrowser インターフェイスを介して統合された全体としてアクセスできます。 Windows エクスプローラー (Explorer.exe) は、ShellExecuteEx または同様の関数を使用して、別のプロセスとして生成できます。

IShellWindows (CLSID_ShellWindows) を使用してエクスプローラーウィンドウを開いてプログラムし、IWebBrowser2 (CLSID_ShellBrowserWindow) を使用して Windows エクスプローラーの新しいインスタンスを作成できます。

次のコード サンプルは、Windows エクスプローラー オートメーション モデルを使用して、実行中のエクスプローラー ウィンドウを作成して検出する方法を示しています。

#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 エクスプローラー クライアント領域は、IExplorerBrowser インターフェイスを使用してホストできます。 Windows エクスプローラー クライアントと名前空間ツリー コントロールは、Windows Vista 以降の標準コンポーネントです。 開発者は、インターフェイスをコンポーネントのビルドとして再利用できます。 これらのコントロールの一般的な用途の 1 つは、問題のドメインに適したカスタマイズされたエクスプローラーを作成することです。

Windows エクスプローラーのコントロールは、次の機能カテゴリに分類されます。

ナビゲーション コントロールは、ユーザーがコンテキストを決定し、関連する論理ドメイン空間 (pagespace と呼ばれる) をナビゲートするのに役立ちます。 たとえば、Windows エクスプローラー の pagespace はシェル名前空間です。 ページスペースは、0 個以上のページで構成されます。

次の表に、Windows Vista 以降のオペレーティング システムの Windows エクスプローラーで使用できるナビゲーション コントロールの一覧と説明を示します。

ナビゲーション コントロール 説明
アドレス バー (階層リンク コントロール) 現在のページのアドレスをページスペースに表示します。 階層リンク ボタンをクリックすると、ページスペース内の任意の先祖に移動できます。 ユーザーは、移動する URL とパスを入力することもできます。
フォルダー ツリー 大きなページスペース用に最適化されたツリー コントロールの新しいバージョンを提供します。
トラベル [戻る] や [進む] などの Web スタイルのボタンを相対ナビゲーションできるようにします。
Title 現在のエクスプローラー名とコンテキストを表示します。
Pagespace ページスペースの現在の分岐を表示します。 ページは異なる条件で並べ替えることができます。 ユーザーはページをクリックしてページに移動できます。

 

コマンド コントロール

コマンド コントロールは、Windows エクスプローラーの機能をユーザーにアドバタイズします。 これらのコントロールは、選択した 1 つのアイテムまたはアイテムに固有の一般的なアクションまたはアクションを実行します。

コマンド コントロール 説明
ツール バー 一般的に使用されるコマンド (コマンド ツール バーの新しいバージョン) のボタンを表示します。 カスタマイズ オプションには、ドロップダウン ボタン、分割ボタン、オプションの説明テキスト、オーバーフロー領域が含まれます。
ヒーロー ツール バーの中央に、単一の省略可能なカスタム コントロールとして表示されます。 現在のコンテキストのプライマリ コマンドを表します。
メニュー バー メニューを使用してコマンドを表示します。
コンテキスト メニュー 項目を右クリックした結果として表示される、コンテキストに関連する使用可能なコマンドのサブセットを一覧表示します。

 

プロパティ コントロールとプレビュー コントロール

プロパティ コントロールとプレビュー コントロールは、アイテムをプレビューしたり、アイテムのプロパティを表示および編集したりするために使用されます。

コントロール 説明
プレビュー サムネイルやライブ アイコンなど、選択したアイテムのプレビューを表示します。
プロパティ 選択した項目のプロパティを表示します。 複数選択の場合、選択した項目グループのプロパティの概要が表示されます。 null を選択すると、現在のページのプロパティの概要 (リスト ビューの内容) が表示されます。

 

コントロールのフィルター処理と表示

フィルターおよびビュー コントロールは、リストビュー内のアイテムのセットを操作したり、リストビュー内のアイテムの表示を変更したりするために使用されます。

コントロール 説明
Assert 列として一覧表示されるプロパティに基づいて、リストビュー内のアイテムをフィルター処理または配置します。 列をクリックすると、そのプロパティで並べ替えられます。
Wordwheel 入力テキスト文字列に基づいて、リストビューに表示される項目を動的および増分的にフィルター処理します。
表示 ユーザーがリストビュー コントロールの表示モードを変更できるようにします。 スライダーを使用して、アイコンのサイズを決定できます。

 

Listview コントロール

listview コントロールは、詳細、タイル、アイコン、パノラマの 4 つのビュー モードのいずれかで項目のセットを表示するために使用されます。 listview コントロールを使用すると、ユーザーは 1 つ以上の項目を選択してアクティブ化することもできます。

注意事項

これらのコントロールの中には、System.Windows.Controls 名前空間にある標準のWindows Presentation Foundation (WPF) コントロールに似た名前や機能がありますが、これらは個別のクラスです。

 

これらの個別のコントロールは、主に、ユーザー操作またはコントロール自体によって生成されたイベントを通じて連携します。 次の表は、3 つの主要なイベント カテゴリを示しています。

イベント カテゴリ
「ナビゲーション」 あるページから別のページに移動します。
選択 リストビューの現在の選択範囲を変更する。
変更の表示 リストビューでプレゼンテーションの順序または表示モードを変更する。