質問: ### 前提・実現したいこと Windows7上の既存のW32/W64アプリケーションのローカルフックで、ファイルがアプリにドロップされたことを検知したいです。 ### 発生している問題・エラーメッセージ 上記内容は WM_DROPFILES の検知でできるかと思い、自分で作成したテストアプリでは容易に検知できました。しかしながら対象としているアプリではそもそも WM_DROPFILES が送られてこないです。拡張ウインドウスタイルに WS_EX_ACCEPTFILES がセットされていないからだと思いますが、ファイル自体はちゃんと添付されます。 そこで標準アプリのメモ帳に関して Spy++ で調べたところ、こちらも WS_EX_ACCEPTFILES はセットされておらず Spy++ でメッセージを監視しても WM_DROPFILES は検出できません。しかしドロップしたファイルがメモ帳で開かれるということは、ドロップしたファイルを検知できているということになりますが、これはどうやってドロップしたファイルをアプリ側で検出しているのでしょうか。 それが分かれば対象アプリのファイルドロップのフックのヒントになるかと考えています。 ご存知の方がいらっしゃいましたらご教授いただけないでしょうか。よろしくお願いします。 追記 : 今回の対象のアプリと同じ現象という意味での例として、メモ帳を挙げたのですがご指摘のように私の間違いでした。いろいろと調べたところ、どうも調査対象のアプリは IDropTarget::Drop で実装しているように思われてきました。この場合 IDropTarget::Drop をフックすることができれば、ドロップされたファイルの情報が得られるかと思うのですが、この関数をフックするにはどのような方法を用いればよいのでしょうか。
回答: > > そこで標準アプリのメモ帳に関して Spy++ で調べたところ、こちらも WS_EX_ACCEPTFILES はセットされておらず Spy++ でメッセージを監視しても WM_DROPFILES は検出できません。 > > > Win10環境+VS2015付属の`Spy++ x64`にてメモ帳の`WS_EX_ACCEPTFILES`フラグおよび`WM_DROPFILES`検出できました。 以下参考まで。 > > 2 番目のバージョンである Spy++ (64 ビット) (spyxx_amd64.exe) は、64 ビット プロセスで実行しているウィンドウに送信されるメッセージを表示するように設計されています。 たとえば、64 ビットのオペレーティング システムでは、メモ帳は 64 ビット プロセスで実行されます。 したがって、Spy++ (64 ビット) を使用して、メモ帳に送信されるメッセージを表示できます。 > > > Spy++ の概要より。 IDropTarget::Dropについて追記 対象アプリのD&Dが本当に`IDropTarget::Drop`で実装されているか確認するのが先決ですが そもそもIDropTarget::Dropをフックすることはできないようです。 IDropTarget::Drop method Hooking 意訳:IDropTarget::Dropはフックできない。かわりにRegisterDragDropをフックしてみては? How to hook IDropTarget::Drop 意訳:できるかもしれないけど悪手。可能なら対象アプリ側に通知手段なりを対応してもらうべき。