web-dev-qa-db-ja.com

C#のドラッグドロップがWindows 7で機能しない

C#winformsを使用してかなり長い間プロジェクトを行ってきました。 Windows 7がリリースされる前に、ドラッグドロップ機能を実装しました。魅力のように働いた。ただし、Windows 7を使用している場合は機能しません。イベントもトリガーされません。

AllowDropはtrueに設定されています。 DragEnterをサブスクライブする場合、Windows 7では呼び出されません(Vistaについては不明)。しかし、XPで機能します。プログラムは、administritave権限で実行されます。

Windows 7とXPのドラッグドロップに違いはありますか?それが適切かどうかはわかりませんが、私はx64を使用しています

46
Oskar Kjellin

ソースプロセスとターゲットプロセスには、互換性のあるセキュリティレベル\特権が必要です。たとえば、ソースがエクスプローラーであり、ユーザーレベルの権限で実行されているが、ターゲットアプリケーションが管理者(昇格)レベルの権限で実行されている場合、ターゲットがセキュリティ問題であるため、ドラッグアンドドロップできません。より高いレベルの特権で実行している。

77
Tim Lloyd

これは、UIPI、ユーザーインターフェイス特権分離と呼ばれます。制限された権限で実行されるプログラムからの入力インジェクションの悪用を防ぐように設計されています。無効にすることができます。これを行う必要があります。

  • マニフェストを変更し、<requestedExecutionLevel>要素のuiAccess属性をtrueに設定します。
  • プログラムのEXEをc:\ windowsまたはc:\ programファイルのサブディレクトリに保存します
  • 有効なコード署名機関からの証明書でEXEに署名する

Ymmv、これを実際に試したことがない。

17
Hans Passant

アプリケーションから、次の値を使用してChangeWindowMessageFilterを呼び出し、昇格したアプリケーションおよびエクスプローラーのような昇格していないアプリケーションへのドラッグアンドドロップを許可します。

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

それは無関係かもしれませんが、私はWindows 8で奇抜なドラッグアンドドロップの問題を抱えていました。しばらくの間動作し、その後動作しなくなります。エクスプローラー間、エディターなどでドラッグアンドドロップできませんでした。Hyper-Vとやり取りすると、VM実行中のウィンドウ7、私のドラッグアンドドロップ機能が変更されました(または、Hyper-Vへのcrtl-alt-deleteをシミュレートするためのctrl-alt-endキーストロークでした)。

私はここに私の問題の解決策を見つけました: Windows 7 Vista XPでドラッグドロップ機能が機能しない問題を修正する

基本的に解決策は:

エクスプローラでファイルを左クリックし、マウスボタンを押しながら[Esc]、[Ctrl]の順に押してから、マウスボタンを離します。私はこれがいくつかのアクセシビリティ設定か何かをリセットしていると仮定しなければなりません。

1
Metro

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メッセージングを使用しているため、まったく影響はありません。

1
BlndLeadingDef

VS 2015およびWindows 7 x64のデスクトップC#アプリケーションをS.Oとしてデバッグするときにも同じ問題が発生しました。これは、私のVSのショートカットに適用された管理者権限が原因でしたIDEデスクトップ(スクリーンショットを参照))。このオプションをオフにすると、ドラッグアンドドロップイベントが適切に発生します。

TimLloydの協力に感謝します。

enter image description here

0
mggSoft