2

CDialogImpl クラスから継承した WTL を使用してダイアログを作成し、メイン ダイアログ内に別のダイアログを作成し、この 2 番目の子ダイアログ内にリスト コントロールを作成しました。リスト コントロールにドラッグ アンド ドロップ機能を追加したかったので、Web で WM_DROPFILES メソッドと Ole ドロップ ターゲットについて読みましたが、後者を選択しました。これに従って、IDropTarget インターフェイス メソッドを実装しまし 。すべてのダイアログでファイルを受け入れるオプションを TRUE に設定し、子ダイアログ クラスで IDropTarget をインスタンス化し、その WM_INITDIALOGUE ハンドラで次のメソッドを呼び出しました。

//drag& drop 
        lpDropTarget = (LPDROPTARGET)new TDropTarget(m_hWnd);
        CoLockObjectExternal(lpDropTarget, true, true);

        // register the HWND as a drop target
        RegisterDragDrop(m_hWnd, lpDropTarget);

lpDropTarget は次のようにインスタンス化されます。

LPDROPTARGET lpDropTarget;

そしてそれはそれについてです。以前に Ole を実際に使用したことがないので、運を求めて次のシナリオを試しました。

  1. List コントロール HWND の RegisterDragDrop に登録し、WM_OLEDROP WM_USER + 1送信した通知を受け取るように親ダイアログを設定しました。ドラッグ アンド ドロップのカーソルは表示されましたが、IDataTarget の関数の実装への呼び出しはありませんでした。

  2. 子ダイアログ用のRegisterDragDropとその通知も。

  3. メインダイアログのRegisterDragDropとその通知も。

後のケース (2 & 3) では、ドラッグ アンド ドロップのカーソルさえ表示されず、ドラッグ アンド ドロップが許可されていないことが示されました。これで、すべてのダイアログとリスト コントロールが、ビジュアル スタジオ デザイナーからのファイルを受け入れるように設定されました。ATL /WTL/WINAPI のみを使用し、MFC を使用しないように制限されています。私は何を間違っていますか?

4

1 に答える 1

3

あなたWM_DROPFILESが処理する必要があるのはあなただけです。IDropTargetなどをいじる必要はありません。

アプリケーションを管理モードで実行する必要がない場合は、管理モードで実行しないでください。同じ ( ) のリンカ設定を無効にしますUAC Execution Level = asInvoker。また、VS を非管理者モードで実行して、アプリケーションも非管理者プロセスで開始されるようにします。このようにして、Explorer.exe はWM_DROPFILESアプリケーションにメッセージを送信できます。

アプリケーションを管理者モードで実行する必要がある場合は、他のアプリケーションがいくつかのメッセージ セットをアプリケーション (ウィンドウ) に送信できるようにする必要があります。以下をせよ:

ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);

新しい関数ChangeWindowMessageFilterExを使用することもできます。

アプリケーションを管理者として実行する必要があり、 を使用してこれらの機能の 1 つを動的に見つける必要がある場合GetProcAddressは、この機能が利用できない OS (Windows XP など) でアプリケーションを実行できることに注意してください。

于 2012-11-27T15:46:42.253 に答える