全体像: エクスプローラーのドラッグ アンド ドロップに独自のラッパーを挿入しようとしています。コードがエクスプローラーに挿入され、ドロップ ターゲットを自分のものに置き換えようとします。
これを行うために、私はやっています:
- すべてのエクスプローラー ウィンドウを検索します (EnumWindows を使用し、各ウィンドウのプロセスの関連付けを確認します)。
- ウィンドウごとに、次の (何もしない) コードを実行しています。
IDropTarget* lpDT = (IDropTarget *)GetProp(hwnds[i], L"OleDropTargetInterface"); // 既存のドロップ ターゲットを取得
HRESULT res1 = ::RevokeDragDrop(hwnds[i]); // 既存のドロップ ターゲットを無効にする
HRESULT res2 = ::RegisterDragDrop(hwnds[i], lpDT); //そして、ドロップ ターゲットを再登録します
今のところ、コードはドロップ ターゲットを変更しません。同じターゲットの登録を解除して再登録しているだけです。
すべてのエクスプローラ ウィンドウで実行した後、res1 == 「別のスレッド用にマーシャリングされたインターフェイスをアプリケーションが呼び出しました。」私が見つけたすべてのウィンドウに対して。
エラーを無視して(テストのためだけに)置き換えを進めると、エクスプローラーはデスクトップでのファイルのドラッグを停止します(アイコンの場所を変更するためだけに)。ところで、驚くべきことに、2 つの異なるフォルダー間でファイルをドラッグしても機能します。
私のコードは、エクスプローラー スレッドから実行されています (エクスプローラーに挿入されます)。
この問題を回避する方法はありますか?