WindowsファイルエクスプローラーからWindowsフォームへのドラッグアンドドロップが機能しない
-
07-07-2019 - |
質問
WindowsエクスプローラーからWindowsフォームアプリケーションにファイルをドラッグする際に問題が発生しました。
テキストをドラッグすると正常に機能しますが、何らかの理由でファイルを認識しません。テストコードは次のとおりです。
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_DragDrop(object sender, DragEventArgs e)
{
}
private void Form1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Text))
{
e.Effect = DragDropEffects.Copy;
}
else if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
}
}
AllowDropはForm1でtrueに設定されており、前述したように、実際のファイルではなく、テキストをフォームにドラッグしても機能します。
Vista 64ビットを使用しています...それが問題の一部かどうかわかりません。
解決
問題は、Vistaの UAC に起因しています。 DevStudioは管理者として実行されていますが、explorerは通常のユーザーとして実行されています。エクスプローラーからファイルをドラッグして、DevStudioホストアプリケーションにドロップすると、特権ユーザーと通信しようとする非特権ユーザーと同じになります。許可されていません。
デバッガーの外部でアプリを実行すると、おそらく表示されません。そこで管理者として実行しない限り(またはVistaがインストーラー/セットアップアプリであることを自動検出する場合)。
エクスプローラを管理者として実行することもできます。少なくともテスト用。または、UACを無効にします(展開中ではなく、開発中にこれらの問題を本当にキャッチしたいのでお勧めしません!)
他のヒント
投稿したコードは動作するはずです 。
これをDragEnterメソッドの先頭に置いてみてください
string formats = string.Join( "\n", e.Data.GetFormats(false) );
MessageBox.Show( formats );
d'n'd操作に関連付けられたデータ形式をダンプします。問題のある場所を絞り込むのに役立つ場合があります。
arul が言及され、まだ機能しませんでしたが、考えさせられました。
私はそれがVistaの問題かもしれないと考え始めたので、Windows XPを持っている友人にそれを送りました。それから、binディレクトリのReleaseフォルダーの外で実行してみましたが、何が機能したのかわかります!
機能しないのは、Visual Studio 2008 IDE内で実行しているときだけです...それは奇妙なことです。
メインメソッドに STAThread
属性を追加しようとしましたか?
[STAThread]
static void Main(string[] args)
{
}
@mattrumaと同じ問題がありました。つまり、ドラッグアンドドロップイベントが発生しませんでした。
mainメソッドに STAThread
属性を追加すると、期待どおりに機能しました。