1

ほとんどの Windows プログラムの [ファイル] -> [名前を付けて保存] にフックされるカスタムの名前を付けて保存ダイアログを作成したいと考えています。このカスタム ダイアログにより、ユーザーはユーザー名、パスワード、宛先フォルダーを入力し、POST 経由でファイルを Web サーバーにアップロードできます。ユーザーがキャンセルをクリックすると、元のファイル ダイアログが呼び出されます。

私はWindows APIフックについて読んでいますが、これは漠然と私がこれにアプローチする方法だと思います:

  1. 「名前を付けて保存」をインターセプト
  2. カスタム ダイアログを表示し、ドライブ上の一時パスを返します
  3. プログラムが一時パスにファイルを書き込むようにします。今のところ、WINAPI CreateFile(...) を呼び出すと仮定します。
  4. 一時ファイルを読み取り、Web サーバーにアップロードする
  5. 一時ファイルのクリーンアップ

しかし、これを実現するために必要な手順については、まだ頭を悩ませることができません。「名前を付けて保存」とCreateFile関数をインターセプトできると仮定すると、ランダムなファイル作成だけでなく、「名前を付けて保存」からCreateFileが呼び出されたことをどのように検出できますか? File ダイアログが開いて CreateFile が呼び出されたときの時間差を追跡するハックを考えることができます。

私の別の解決策は、既存のファイル ダイアログを使用して、ディスク上に特別なフォルダーを作成し、常に監視することです。そこにファイルが書き込まれると、ファイルをアップロードする外部プログラムが呼び出されます。私はまだこれを行う方法を調べていません。これは簡単だと思います。

アップデート

最初の赤ちゃんのステップとして、ユーザーがログインの詳細と監視するフォルダーを入力できるようにする .NET タスク トレイ アプリケーションを作成しました。そこにファイルがドロップされるたびに、Web サーバーにアップロードされます。これまでのところ、うまくいくようです。次に、ファイル ダイアログの左側のペインに適切なショートカットを追加する方法を理解する必要があります。それが完了したら、私は満足のいく解決策を得たと思います。

4

2 に答える 2

2

何かをフックしたりパッチを当てたりする必要はありません。IStorage::CreateStreamデータを Web サーバーに POST するストリームを返すことによって、それをサポートおよび実装するシェル名前空間拡張を作成します。ユーザーは、ファイルをアップロードするために、ファイルを名前空間拡張子に保存することを選択できます。

于 2012-10-19T03:58:52.563 に答える
1

標準の保存ダイアログをフックするには、実行中のすべてのプロセスにDLLを挿入GetSaveFileName()し、プロセスのPEヘッダーにあるWin32 API関数のインポートスタブを置き換える必要があります(ウイルス対策およびマルウェア対策アプリが満足できない可能性があります) )。

次に、の代わりに新しいIFileSaveDialogCOMインターフェイスを使用してVistaで導入された新しいスタイルの保存ダイアログがありGetSaveFileName()ます。そのためには、MicrosoftのデフォルトのFileDialogCOMオブジェクトをアンインストールしてカスタム実装に置き換える必要があります。

これは、フックする可能性が低いカスタムメイドの保存ダイアログをカウントしません。

奇跡によって、ダイアログをフックして、独自に作成したカスタムパスを返すことができる場合は、CreateFile()それ自体をフックする必要はありません。目的のために作成したフォルダーを監視するだけです。あなた以外の他のアプリ(またはユーザー)がファイルを書き込む可能性が低い場所に配置します。AppDataその目的のために、ユーザーまたはシステムのフォルダーにカスタムサブフォルダーを作成できます。これらのフォルダを使用SHGetSpecialFolderPath()および/または検索できます。SHGetKnownFolderPath()

トリッキーな部分は、ファイルへの書き込みが終了して閉じられたことを検出することです。ReadDirectoryChangesW()またはなどの変更がないかフォルダを監視し、SHChangeNotifyRegister()排他的アクセスのために新しい/変更されたファイルを定期的に開く必要があります。他の人がファイルを開いている場合は、自分で開くことはできません。しかし、一度開くと、好きなように操作できます。

于 2012-10-19T02:49:45.217 に答える