10

データベースアプリケーションを開発します。ユーザーが新機能を要求します。Windowsエクスプローラーが新しいファイルとして貼り付けることができるように、blobをクリップボードにコピーします。1つの解決策は、blobを一時フォルダーに保存し、これらの一時ファイルをクリップボードに追加することです。

しかし、私はより良い解決策を探しています。Windowsエクスプローラーで貼り付けアクションをフックして、ブロブを宛先パスに自分で保存することは可能ですか?

4

4 に答える 4

13

試したことはありませんが、確かに可能だと思います。シェルクリップボード形式のMSDNドキュメントをご覧ください。CFSTR_FILECONTENTSそしてCFSTR_FILEDESCRIPTOR、あなたが扱うことになっていると思われるフォーマットです。

さらに、Code Projectで、デモプログラムを提供する記事を見つけました。アプリからWindowsエクスプローラーに仮想ファイルをドラッグする方法

更新: .NETで記述された例:

于 2009-04-16T14:12:05.940 に答える
7

MSDNの記事「シェルデータ転送シナリオの処理」から

  • 既存のファイルはCF_HDROP形式で提供する必要があります。
  • CFSTR_FILECONTENTS/CFSTR_FILEDESCRIPTOR形式のファイルのようなデータを提供します。このアプローチにより、ターゲットは、基盤となるデータストレージについて何も知らなくても、データオブジェクトからファイルを作成できます。通常、データはIStreamインターフェイスとして表示する必要があります。このデータ転送メカニズムは、グローバルメモリオブジェクトよりも柔軟性があり、使用するメモリがはるかに少なくなります。

MSDNから読むべき他の2つの良い記事は次のとおりです。

クリップボードを使用してファイルを転送する作業を始めたとき、3つの記事すべてを印刷して、数回読みました。

インターフェイスの処理は非常に複雑になる可能性があります。私はこれを助けるためにそこに2つの良いライブラリを見つけました。

Delphi用のドラッグアンドドロップコンポーネントスイート。ホームページを下にスクロールすると、いくつかのFAQがよく読まれていることがわかります。ダウンロードにはサンプルアプリケーションもたくさんあります。AsyncSourceのデモは、探しているものに役立つはずだと思います。スイートはソース付きのフリーウェアです。コードはよくコメントされているようです。

現在、QuasidataのTransfer@Onceコンポーネントを使用しています。無料ではありませんが、非常に安価です。当時、ドラッグアンドドロップコンポーネントスイートよりもサポートが優れていたため、最初はTransfer@Onceを使用しました。しかし、その状況は逆転しました。Transfer @OnceはまだDelphi2009をサポートしていません。アプリケーションの移動に取り掛かったら、おそらくコンポーネントを切り替えます。Transfer@Onceコードは購入に含まれています。個人的には、ドラッグアンドドロップコードの方が読みやすく、わかりやすいことがわかりました。

于 2009-04-16T16:43:35.720 に答える
5

エクスプローラーは宛先ファイル自体にコピーを行うので、宛先ファイルを直接書き込む方法はありません。ソースファイルの名前は、データをクリップボードにコピーしたアプリケーションからのみ取得でき、エクスプローラーである必要はないため、これは理にかなっています。OTOH宛先ファイルの名前は実際には異なる場合があります。これは、同じ名前のファイルが宛先フォルダーに既に存在している可能性があり、エクスプローラーのみが宛先ファイルの変更された名前を作成できるためです( "Copy of"の先頭に追加するか"( 2) "をベースファイル名に)。

ファイルを貼り付けることができるように、Windowsエクスプローラーのクリップボード形式を提供する必要があります。標準のクリップボード形式のドキュメントは、 CF_HDROPが正しいものであることを示唆しています。このクリップボード形式では、ソースファイル名のリストを提供しますが、ファイルはもちろん存在する必要があるため、ディスクに保存する必要があります。

ただし、プロセスを可能な限り軽量にすることもできます。通常、ユーザーがデータをクリップボードにコピーすると、貼り付け操作に使用されるかどうかに関係なく、データはすぐにクリップボードに配置されます。アプリケーションの場合、毎回ファイルを作成し、ファイル名のリストをクリップボードに入れる必要があることを意味します。ただし、Windowsは遅延レンダリングと呼ばれるモードをサポートしています。これはまさにそのような場合に使用されます。基本的に、データの空のスタブのみをクリップボードに置き、別のアプリケーションがデータにアクセスしようとしたときにのみ、アプリから要求されます。したがって、ユーザーがファイルをエクスプローラーに貼り付けようとしたときにのみ、ファイルをディスクに保存してファイル名のリストを返すようにこれを実装できます。

于 2009-04-16T14:00:44.890 に答える
1

コピー/貼り付けをいじってからしばらく経ちましたが、提案されていることを実行できると確信しています(blobを新しいファイルとしてクリップボードに挿入します)。

クリップボードに追加する方法に応じて、コピーするデータの種類を指定できることを覚えているようです。そのデータ型を正しく取得すれば、Windowsエクスプローラーからコピーしたかのように貼り付けることができると思います。

機会があれば、今晩、もう少し詳細を調べてみます(ここですべてのブックマークを使用しているわけではありません)...

[編集]ドラッグアンドドロップに関するwxWidgetsのドキュメントをご覧ください。それは私が取り組んできたものであり、データ型に関するいくつかのヒントを提供します。

何を書いていますか?デルファイ?

[編集2]これは実際にはWindows(?)の制限かもしれないと思います。これはwxWidgetsのドキュメントかもしれませんが、ファイル自体ではなくファイル名のみをコピーすることをお勧めします。その場合は、最初に一時ファイルを作成するという元の提案を使用する必要があります:-(

于 2009-04-16T12:43:28.023 に答える