IExplorerBrowserインターフェイスを使用してアプリケーション内にWindowsシェルを実装するMFCアプリケーションがあります。このアプリケーションでは、エクスプローラのシェルビュー内でユーザーがクリックしてフォルダを作成できるボタンがあります。フォルダが作成されたら、アプリケーションはユーザーがフォルダの名前を変更できるようにする必要があります。言い換えれば、Windowsエクスプローラにフォルダを作成するのとまったく同じように動作します。私はIFileOperationsインターフェイスのNewItemメソッドを使ってフォルダを作成しました。ここで私はCREATEFOLDER(...)を呼び出した後、自分のアプリケーション内でIExplorerbrowser IFolderview2フォルダポスト通知を作成する
HRESULT CreateFolder(__in IShellItem *pDestinationFolder, PCWSTR pszNewName)
{
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
CComPtr<IFileOperation> pFileOperation;
hr = CoCreateInstance(CLSID_FileOperation,
NULL,
CLSCTX_ALL,
IID_PPV_ARGS(&pFileOperation));
if (SUCCEEDED(hr))
{
hr = pFileOperation->SetOperationFlags(FOF_NO_UI);
if (SUCCEEDED(hr))
{
hr = pFileOperation->NewItem(pDestinationFolder, FILE_ATTRIBUTE_DIRECTORY, pszNewName, NULL, NULL);
if (SUCCEEDED(hr))
{
hr = pFileOperation->PerformOperations();
}
}
}
}
CoUninitialize();
return hr;
}
をフォルダを作成するための私の正確なコードがあり、私はIFolderView2インターフェースののSelectItemメソッドを使用してモードを選択するためにフォルダを置きます。
HRESULT hr = m_pIExplorerBrowser->GetCurrentView(IID_PPV_ARGS(pFolderView2));
if(SUCCEEDED(hr))
pFolderView2->SelectItem(nLastCreatedFolderIndex, SVSI_EDIT);
問題は、CreateFolderが私のSelectItemメソッド呼び出しより後で終了するということです。私はCreateFolderによってビューが更新されたときに私に教えてくれるイベントを探していたので、その後SelectItemメソッドを送信することができます。
この問題に関するお手伝いをさせていただきます。
「IExplorerBrowser」に何かを複製して、なぜそれが既に正確な複製であるかをエクスプローラブラウザのように見せたいのか分かりません。おそらく、エクスプローラの動作を変更したい場合は、 'CMFCShellListCtrl'を使用する方が簡単かもしれません。 –
IExplorerbrowserを複製しようとしていません。 IExplorerbrowserは私のすべての要件を満たしています。しかし、問題は私のアプリケーションでは、ユーザーがシェルの一部ではないボタンをクリックすることでフォルダを作成できるということです。彼らがそうするとき、私はまだユーザーがフォルダの名前をタイプできるようにします。私は基本的に、新しいフォルダがシェルビューに表示されたときに発生するイベントを探しています。 – CoolAn
私はあなたが何を意味するかを見ます。しかし、もう一度あなたの質問を読んで、私はあなたがイベント処理を必要とは思わない。 'pFileOperation-> PerformOperations()'はディレクトリが作成されるまで戻りません。 'PostMessage'のようなものではありません。もう一度それをチェックしてください。 –