ドラッグアンドドロップが出来ない場合、ここを疑え

コンピュータ

開発をしていて、
「いつもは動くはずのコードなのに、なぜかドラッグアンドドロップが動かない」
そんな経験をしたことはないでしょうか。

AllowDrop を true にしている。
イベントも正しく登録している。
例外も出ない。

それでも一切反応しない。

私もまさにその状況に遭遇しました。


結論:管理者権限で実行していませんか?

Windows では、管理者権限で起動したアプリケーションに対して、
通常権限で動作しているアプリ(エクスプローラなど)からの
ドラッグアンドドロップが禁止されています。

これはバグではなく、
**Windows のセキュリティ仕様(UIPI:User Interface Privilege Isolation)**によるものです。

そのため、

  • AllowDrop を設定しても

  • DragEnter / Drop イベントを書いても

  • どれだけコードを修正しても

管理者権限で起動している限り、ドラッグアンドドロップは動きません。


なぜ禁止されているのか

もし通常権限のアプリから、
管理者権限のアプリへ自由にデータを渡せてしまうと、

  • 権限昇格の踏み台になる

  • 意図しないコード実行につながる

といった重大なセキュリティ問題が発生します。

そのため Windows では、
権限レベルの異なるプロセス間の UI 操作そのものを OS が遮断しています。


対処方法

対処方法は非常にシンプルです。

  • アプリを管理者権限で起動しない

これしかありません。

どうしても管理者権限が必要な処理がある場合は、

  • 通常権限で起動する本体アプリ

  • 管理者権限で実行する別プロセス

を分離する構成にする必要があります。

さいごに

なお、私は WPF でアプリを作成していてこの問題に遭遇しましたが、
これは WPF 固有の問題ではありません。

Windows のセキュリティ仕様による制限のため、
Win32、WinForms、UWP、Electron、Qt など、
開発環境に関係なく Windows 上で動作するアプリであれば
同様の現象が発生する可能性があります。

ドラッグアンドドロップが突然動かなくなった場合は、
フレームワークや実装を疑う前に、
まず実行時の権限(管理者として起動していないか)を確認してみてください。

コメント