sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

Visual Studio (管理者実行) のデバッグ時、ドラッグアンドドロップが使えない簡単な対応

原因

Visual Studioデバッグモードで起動したウィンドウは「管理者権限」、デスクトップなどの explorer.exe は「管理者権限ではない」ときにドラッグ&ドロップを受け付けない問題が起こるようです。

Windows Vista 以降に追加された ユーザー インターフェイス特権の分離 (UIPI) から発生している仕様です。

不便なので、デバッグ時でもドラッグ&ドロップできるようにしたい、という趣旨です。

症状の確認

f:id:shikaku_sh:20180411171842p:plain:w240

Windows OS を管理者で実行していれば explorer.exe も管理者実行になるかといえば、私のようにそうならないことがあるようです。 UAC のレベルは「通知しない」です。

f:id:shikaku_sh:20180411171849p:plain:w300 f:id:shikaku_sh:20180411171846p:plain:w200

タスクマネージャーを起動して (Esc + Shift + Ctrl) 詳細のタブを選択します。「名前、状態、 CPU 、メモリ……」と並んでいる列に「管理者特権」が無ければ、列を右クリックして「列の選択」から追加してください。
見ての通り、私は管理者でありながら「explorer.exe」の管理者特権がありませんでした。
(ちなみに、タスクマネージャーで explorer.exe タスクを kill することは当然できます。しかし、管理者特権を付与して作成しようとしても、付与できていませんでした)

この権限付与の仕様について、ちょうどよい情報が見つからないのですが、同様の意見を述べているのは見つけました。

今回一番不便だと感じたのは エクスプローラー(Explorer.exe)を管理者権限にできないことです。

エクスプローラーは管理者権限にできません

対応

explorer.exe」の代わりに適当なファイラーをダウンロードしてきて、管理者権限を持たせたファイラーからドラッグ&ドロップすればよいです。

手軽なのは「Explorer++」です。
右クリックから「管理者として実行する」を選んで、ファイラーを起動します。あとは、デバッグ中のウィンドウにドラッグ&ドロップします。両者の権限が一致すれば、イベントが発生します。

極端な話、メモ帳 (notepad.exe) を管理者権限で起動して「名前をつけて保存」などのダイアログからドラッグ&ドロップでもよいです。

補足

ユーザー インターフェイス特権の分離 (UIPI) の設定を解除することもできますが、推奨とはいえません。
下記フォーラムの指摘の内容が適切だと私は思いました。

ChangeWindowMessageFilter()にてこの制限を解除することもできますが、それよりは安易に管理者権限を要求すべきではないです。UACの主旨を理解しアプリケーションを設計されることをお勧めします。

MSDN フォーラム - 管理者権限で実行すると Drag&Drop が効かない

参考

Gushwell's Dev Notes - VistaでDrag&Dropできない