C#winformsを使用してかなり長い間プロジェクトを行ってきました。 Windows 7がリリースされる前に、ドラッグドロップ機能を実装しました。魅力のように働いた。ただし、Windows 7を使用している場合は機能しません。イベントもトリガーされません。
AllowDrop
はtrueに設定されています。 DragEnter
をサブスクライブする場合、Windows 7では呼び出されません(Vistaについては不明)。しかし、XPで機能します。プログラムは、administritave権限で実行されます。
Windows 7とXPのドラッグドロップに違いはありますか?それが適切かどうかはわかりませんが、私はx64を使用しています
ソースプロセスとターゲットプロセスには、互換性のあるセキュリティレベル\特権が必要です。たとえば、ソースがエクスプローラーであり、ユーザーレベルの権限で実行されているが、ターゲットアプリケーションが管理者(昇格)レベルの権限で実行されている場合、ターゲットがセキュリティ問題であるため、ドラッグアンドドロップできません。より高いレベルの特権で実行している。
これは、UIPI、ユーザーインターフェイス特権分離と呼ばれます。制限された権限で実行されるプログラムからの入力インジェクションの悪用を防ぐように設計されています。無効にすることができます。これを行う必要があります。
<requestedExecutionLevel>
要素のuiAccess属性をtrueに設定します。Ymmv、これを実際に試したことがない。
アプリケーションから、次の値を使用してChangeWindowMessageFilterを呼び出し、昇格したアプリケーションおよびエクスプローラーのような昇格していないアプリケーションへのドラッグアンドドロップを許可します。
ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);
それは無関係かもしれませんが、私はWindows 8で奇抜なドラッグアンドドロップの問題を抱えていました。しばらくの間動作し、その後動作しなくなります。エクスプローラー間、エディターなどでドラッグアンドドロップできませんでした。Hyper-Vとやり取りすると、VM実行中のウィンドウ7、私のドラッグアンドドロップ機能が変更されました(または、Hyper-Vへのcrtl-alt-deleteをシミュレートするためのctrl-alt-endキーストロークでした)。
私はここに私の問題の解決策を見つけました: Windows 7 Vista XPでドラッグドロップ機能が機能しない問題を修正する
基本的に解決策は:
エクスプローラでファイルを左クリックし、マウスボタンを押しながら[Esc]、[Ctrl]の順に押してから、マウスボタンを離します。私はこれがいくつかのアクセシビリティ設定か何かをリセットしていると仮定しなければなりません。
Dmexの投稿へのマイナーな追加。以下は変数と定数を定義します。
private const uint WM_DROPFILES = 0x233;
private const uint WM_COPYDATA = 0x004A;
private const uint WM_COPYGLOBALDATA = 0x0049;
private const uint MSGFLT_ADD = 1;
また、アプリケーションがWindows 7の場合は ChangeWindowMessageFilterEx
の使用を検討してください。また、OLEドラッグアンドドロップでは、 Windowsメッセージングを使用しているため、まったく影響はありません。