共通ダイアログのリストビューで、選択したアイテムのテキストを取得できます。ただし、PIDLを取得することはできません。また、ユーザーが既知の拡張子(デフォルト)を非表示にすることを選択した場合、拡張子またはPIDLがないと、どのファイルが選択されたかを実際に知ることはできません。
したがって、これを解決するための可能な方法は次のとおりです。
- 標準のファイルを開くダイアログからIShellViewを取得します。基礎となるIShellViewは、現在の選択に対するPIDLが何であるかを知ることができます。したがって、IShellViewを簡単に入手できれば、私は金色になります。残念ながら、それを行うCDM_xxxは見当たりません。そして、私はそれを達成するかもしれない何かの頭のてっぺんから考えることはできません!!! :(
- 他のアイデア?!
以前は、Windows 9x、2000、およびXPバージョンの共通ファイルダイアログが各アイテムのPIDLをLVITEMデータに保存しているという事実に依存していました(Paul DiLasciaの元のクレジット)。
LPCITEMIDLIST pidlItem =(LPCITEMIDLIST)pListCtrl-> GetItemData(nItem);
ただし、Vistaの一般的なコントロール以降では、その手法は失敗します:(
何かご意見は?
編集:リストビューで現在選択されているアイテムだけでなく、リストビューのすべてのアイテムについてこの情報を取得できる必要があります。
EDIT2:私がとても深く掘り下げる必要がある理由:
以前のバージョンのアプリでは、次の機能を提供しています。(1)カスタムボタン[プレビュー]を押してダイアログを閉じますが、ビューに現在表示されているアイテムのリストを、表示されている順序でアプリに転送します。現在強調表示されているもののインデックス。このリストは完全に指定する必要があります。すべて「J1329192」である3つのファイルを表示します(実際に3つのファイル「J1329192.xyz」「J1329192.xzy」および「J1329192.zyx」(この順序で)がある場合)は役に立ちません。
ユーザーは「ファイル名:」フィールドに部分的なファイル名フィルターを入力でき、共通ダイアログには、ユーザーが選択したソート順で、指定された部分的なフィルターに一致するファイルのみが表示されます。したがって、ユーザーがプレビューしたいものを正確にアプリに報告するには、リストビューコントロール(または共通ダイアログ自体)からその情報をクエリできる必要があります。
ファイルダイアログに他の機能拡張も行います。たとえば、ユーザーの現在の選択をサムネイルとして表示するインプレースプレビューペインや、カスタムの最近の場所のインターフェイスなどがあります。これはすべて可能でした(多くの場合) Vistaより前の作業)。ビスタ後、私は壁にぶつかりました。当面は、独自の機能がほとんどない標準のファイルダイアログを使用しますが、これは顧客との相性がよくありません(機能Xはどうなりましたか?!)
他にも機能強化がありますが、これは大まかな概要です。そして、それらはすべて、「本当に、正直なところ、インデックスXのビューに具体的にどのファイルがあるのか」という知識を必要とすることになります。そして、理由は不明ですが、Microsoftはそのようなインターフェイスを提供する必要性を感じていないようです。実際、彼らは決してしませんでした。いくつかのハッキングとリバースエンジニアリングによってのみ、内部で物事がどのように機能するかを理解し、必要な情報を得ることができました。そして、はい、それはサポートされていません、そしてはい、MSは必然的に私たちのコードを壊しました。私は彼らのせいではありません-私が不快だと思うのは、彼らの新しい、より洗練されたインターフェースが古いものよりもはるかに閉じていることです-そして彼らはこれらのダイアログの機能強化を行うためのより多くの先行インターフェース(サポートされているインターフェース)を提供していませんでした。