0

全体像: エクスプローラーのドラッグ アンド ドロップに独自のラッパーを挿入しようとしています。コードがエクスプローラーに挿入され、ドロップ ターゲットを自分のものに置き換えようとします。

これを行うために、私はやっています:

  1. すべてのエクスプローラー ウィンドウを検索します (EnumWindows を使用し、各ウィンドウのプロセスの関連付けを確認します)。
  2. ウィンドウごとに、次の (何もしない) コードを実行しています。

IDropTarget* lpDT = (IDropTarget *)GetProp(hwnds[i], L"OleDropTargetInterface"); // 既存のドロップ ターゲットを取得

HRESULT res1 = ::RevokeDragDrop(hwnds[i]); // 既存のドロップ ターゲットを無効にする

HRESULT res2 = ::RegisterDragDrop(hwnds[i], lpDT); //そして、ドロップ ターゲットを再登録します

今のところ、コードはドロップ ターゲットを変更しません。同じターゲットの登録を解除して再登録しているだけです。

すべてのエクスプローラ ウィンドウで実行した後、res1 == 「別のスレッド用にマーシャリングされたインターフェイスをアプリケーションが呼び出しました。」私が見つけたすべてのウィンドウに対して。

エラーを無視して(テストのためだけに)置き換えを進めると、エクスプローラーはデスクトップでのファイルのドラッグを停止します(アイコンの場所を変更するためだけに)。ところで、驚くべきことに、2 つの異なるフォルダー間でファイルをドラッグしても機能します。

私のコードは、エクスプローラー スレッドから実行されています (エクスプローラーに挿入されます)。

この問題を回避する方法はありますか?

4

1 に答える 1

-1

GetPropは、マーシャリングを気にせずにドロップターゲットへのポインターを返します(純粋なポインター)。この回答で私に指摘されているように、ドロップターゲットへのポインターを取得していますが、実際にはスレッドにマーシャリングされていません。ポインタでrevokeDragDropを呼び出すと(実際にはスレッドに属していない場合でも)、ドロップターゲットが台無しになり、失敗したことがわかります。

ドロップターゲットを保持している他のスレッドからドロップターゲットを取得する方法がないため、これをあきらめて別のルートを使用しました。

于 2012-05-23T17:33:58.317 に答える