OFD はトリッキーです。これは汎用のファイル ピッカーであり、ファイルに対して「可能な限り役立つ」ことを目的としています。フィルターは、ユーザーにとっては小さなヘルパーにすぎません。他のファイルの選択をブロックしません。
Paintbrush またはアプリケーションを実行し、ファイル ピッカーを開きます。ファイルタイプのコンボボックスには、おそらくいくつかのフィルターが表示され、実際にダイアログにはそのファイルのみが表示されます。ファイル名として「*」を入力し、OK/Enter を押します。ほぼ確実に、フィルターに関係なくすべてのファイルが表示されるようになります。
この動作は使用しても問題ありませんか? そのダイアログからいくつかのファイルを非表示にしたい場合は、そうではないと思います。私が正しければ、OFD は単にあなたのためではありません。表示したいものをリストするだけの ListView/etc をビルドして、独自の単純な「SDF データベース ピッカー」を作成する必要があります。
そうでない場合は、HANDLE (.Net では として渡されますIntPtr
) をウィンドウにフェッチし、ウィンドウ構造を調べて (IIRC) SysListView コントロールを見つけ、それに話しかけて削除します。不要な要素。すべてのジョブは、C++ または P/Invoke によって実行されます。本当に必要な場合は、いくつかのリンクを見つけようとします。私にメモをドロップします。
--
まず初めに、コンポーネント名のタイプミスをお詫びします。ウィンドウ クラスはSysListView32
.
最初に、いくつかの記事をざっと目を通してください。ほとんどの場合、WPF ではなく System.Windows.Forms を参照するため、注意してください。ほとんどの情報は正確で関連性があります。内部的には同じコンポーネントであり、jsut のラップが少し異なるためです。
ウィンドウを開くアクションのインターセプトに成功し、SHELLDLL_DefView/SysListView32 コントロールへの HANDLE (IntPtr) を取得したら、実際のゲームをプレイする準備が整います。
コントロールは、その名前が「SysListView32」であるにもかかわらず、実際には「ListView」という名前であり、ウィンドウ自体とほぼ同じくらい古い comctl32.dll から来ています。「生のwinapiメッセージ」を送信することで、コントロールを動的に再構成することは非常に簡単ですが、.Netでそれを行うためのきれいな方法がないのが厄介です。P/Invoke をSendMessageにする必要があるため、 MSDNでその機能についても読んでください。その最初のパラメーターは、先ほど見つけた (HWND = [H]andle-to-[W]i[ND]ow) (IntPtr) にほかなりHWND
ません。HANDLE
「ListView」と呼ばれるコントロールは、さまざまなメッセージをすべて理解します。コントロールはウィンドウなので、WM_xxxx メッセージ ([W]window[M]essage_xxx) を理解します。また、大騒ぎも理解しており、さらに重要なことに、LVM_GETITEM などの LVM_xxxx メッセージ ([L]ist[V]iew[M] essage_xxxx ) の形式で独自の API も定義しています。その LVM_GETITEM ページには、他の LVM_xxx メッセージの膨大なリストがあることに注意してください: GETITEMCOUNT、INSERTITEM、DELETEITEM など。これはVBの例です「3行目の項目」の削除方法について。ListView の自然なビューはグリッド/行ベースであるため、行。デスクトップのような表示モードが追加されました。すべてのアイテムは、XY グリッド セルではなく、連続した行にあると論理的に見なされます。そうですね、DESKTOP と、同じく SysListView32 によって行われる自由形式のアイコンの配置を除いては、それはまた別の話です..
ListViews に関する一連の優れた記事を次に
示します。および P/Invoke です。
ネイティブ コントロールは ListView という名前で、実際、[System.Windows.Forms.ListView] はその .Net ラッパーです。ただし、そのクラスのインスタンスを既存のネイティブ コンポーネント インスタンスにバインドする適切な方法はありません。このクラスは、新しいネイティブ ListView コンポーネントをゼロから作成するように設計されています。グーグルのスキルや運があれば、そのような ListView をネイティブの Listview にバインドしてみると、P/Invoke の手間を省くことができますが、それは本当に価値があるとは思いません..
コントロールを手動で駆動/パッチ/ホットフィックスすることは、さらに複雑です。たとえば、変更後に画面を更新するためにそれらを覚えておくために、それらをキックする必要がある場合があります: http://www.codeproject.com/Questions/181852/ListView-破損後 LVM_DELETEITEM メッセージ. さらに、アイテムのフィルタリングは 1 回限りの作業ではありません。ユーザーがフォルダ ツリーを上下に移動すると、何度も何度もフィルタする必要があります。ユーザーが別のフォルダーの新しいコンテンツを表示したときに通知を受ける方法を見つける必要があります。幸いなことに、LVM を使用するすべての人は、現在使用しているのと同じ API を使用することになります。これは、ファイル ダイアログが一連の LVI_DELETExxx/LVI_INSERTxxx メッセージをコントロールに送信する必要があることを意味し、それらをインターセプト + インスペクション + フィルター アウトしようとする可能性があるため、「不良アイテム」は、アイテムが配置されるとその場で追い出されます。リスト..これは、それを「簡単に」行う方法に関する私の提案です。
これが問題の解決に役立つことを願っています。全体として、ネイティブ コントロールと P/Invoke を数回使用したことがない限り、簡単ではありません。問題を再考することをお勧めします。単純なファイル名の検証と「申し訳ありませんが、このファイルは使用できません」というメッセージボックスで本当に解決できないのでしょうか? それは数桁簡単になるでしょう..
ハンドルをフェッチし、アイテムを読み取って削除するための完全な/正確なコードが見つからなかったのは残念です。数年前にそのような例を見たことは知っていますが、今は何も見つかりません:( 例をスクラッチする時間があるかもしれませんが、それを当てにしないでください。いつ時間ができるかわかりませんその問題でさらに遊んでください。