2008-11-11 66 views
8

我遇到了將文件從Windows資源管理器拖動到Windows窗體應用程序的問題。從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設置爲true Form1上,正如我所提到的,它的工作原理,如果我拖動文本上的形式,只是沒有實際的文件。

我使用Vista 64位...不知道這是否是問題的一部分。

回答

20

問題來自Vista的UAC。 DevStudio以管理員身份運行,但explorer正在以普通用戶身份運行。當您從資源管理器中拖動文件並將其放到DevStudio託管的應用程序中時,這與嘗試與特權用戶通信的非特權用戶相同。這不被允許。

當您在調試器外部運行應用程序時,這可能不會顯示出來。除非你以管理員身份運行它(或者如果Vista自動檢測到它是安裝程序/設置應用程序)。

您也可以run explorer as an admin,至少用於測試。或者禁用UAC(我不建議這麼做,因爲你真的想在開發過程中捕獲這些問題,而不是在部署過程中)

+0

那麼,這就解決了我一直在處理的應用程序中遇到的問題。我發現一個很好的解決方法,允許您調試應用程序,並且仍然具有拖放功能,即在調試器外部運行應用程序,然後將調試器附加到進程。 – RobH 2011-05-06 20:36:23

0

您發佈的代碼應該工作。

嘗試把這個在爲dragenter方法

string formats = string.Join("\n", e.Data.GetFormats(false)); 
MessageBox.Show(formats); 

將轉儲與德n'd操作的數據格式的開始。可以幫助我們縮小問題所在。

+0

@arul做到了......仍然沒有工作,但發現了一些有趣的東西。看看我的答案。 – mattruma 2008-11-11 21:51:54

0

我添加了代碼arul提到的東西仍然沒有工作,但它讓我思考。

我開始認爲這可能是一個Vista問題,所以我把它發送給一個有Windows XP的朋友,它運行得很好!然後我試着在bin目錄的Release文件夾外面運行它,並且你知道它的工作原理!

唯一不工作的時候,我在Visual Studio 2008 IDE中運行它......這很奇怪。

+0

您是否以管理員身份運行Vis'Studio? – 2010-01-16 07:33:54

0

您是否嘗試將STAThread屬性添加到main方法?

[STAThread] 
    static void Main(string[] args) 
    { 
    } 

我有同樣的問題,因爲@mattruma這意味着我得到了不能拖動&丟棄事件。 將STAThread屬性添加到主方法後,其按預期工作。

相關問題