開発をしていて、
「いつもは動くはずのコードなのに、なぜかドラッグアンドドロップが動かない」
そんな経験をしたことはないでしょうか。
AllowDrop を true にしている。
イベントも正しく登録している。
例外も出ない。
それでも一切反応しない。
私もまさにその状況に遭遇しました。
結論:管理者権限で実行していませんか?
Windows では、管理者権限で起動したアプリケーションに対して、
通常権限で動作しているアプリ(エクスプローラなど)からの
ドラッグアンドドロップが禁止されています。
これはバグではなく、
**Windows のセキュリティ仕様(UIPI:User Interface Privilege Isolation)**によるものです。
そのため、
-
AllowDrop を設定しても
-
DragEnter / Drop イベントを書いても
-
どれだけコードを修正しても
管理者権限で起動している限り、ドラッグアンドドロップは動きません。
なぜ禁止されているのか
もし通常権限のアプリから、
管理者権限のアプリへ自由にデータを渡せてしまうと、
-
権限昇格の踏み台になる
-
意図しないコード実行につながる
といった重大なセキュリティ問題が発生します。
そのため Windows では、
権限レベルの異なるプロセス間の UI 操作そのものを OS が遮断しています。
対処方法
対処方法は非常にシンプルです。
-
アプリを管理者権限で起動しない
これしかありません。
どうしても管理者権限が必要な処理がある場合は、
-
通常権限で起動する本体アプリ
-
管理者権限で実行する別プロセス
を分離する構成にする必要があります。
さいごに
なお、私は WPF でアプリを作成していてこの問題に遭遇しましたが、
これは WPF 固有の問題ではありません。
Windows のセキュリティ仕様による制限のため、
Win32、WinForms、UWP、Electron、Qt など、
開発環境に関係なく Windows 上で動作するアプリであれば
同様の現象が発生する可能性があります。
ドラッグアンドドロップが突然動かなくなった場合は、
フレームワークや実装を疑う前に、
まず実行時の権限(管理者として起動していないか)を確認してみてください。

コメント