C#.WinForm 拖動文件到PictrueBox(支援跨UAC拖動)

如程式以普通方式打開,那麼DragDrop DragEnter 事件是可以正常使用的。但以管理員身份運行時,這兩個方法將失效。

原因是 Windows機制(用戶介面特權隔離).

 UIPI:用戶介面特權隔離(User Interface Privilege Isolation),是 Windows 7 通過 MIC 機制新引入的一種安全特性,用於攔截接收比自身進程 MIC 等級低的進程發來的消息。UIPI 的目的是為了規範不同進程窗口之間的窗口消息處理過程,默認情況下,高許可權進程不會接收到低許可權進程發送的窗口消息的,但是低許可權進程能夠接收到高許可權進程的窗口消息。UIPI 的本質是系統檢查目標窗口和發送方是否具有相同的 MIC 等級或者發送方具有更高的 MIC 等級,如果符合上述條件,則允許消息的傳遞,否則將消息丟棄。
 因此,在 Windows 7 作業系統中運行的用戶進程,如果運行時具有不同的完整性等級,即具有不同的 MIC 等級,那麼相互間的通訊將會無法像 Windows XP 那樣正常進行。

解決方案:

採用 ChangeWindowMessageFilterEx 函數,為指定窗口修改用戶介面特權隔離 (UIPI) 消息過濾器。

通俗點就是 用於過濾指定句柄 的 低許可權向高許可權發送消息不成功的限制.

網上淘了了一個類可供參考,下載地址文章末尾。

使用方法:

在窗體內定義變數 

1 public FileDropHandler FileDroper = null;

在窗體載入Load方法加入 

1  FileDroper = new FileDropHandler(this);
2  FileDroper = new FileDropHandler(pictureBox1);

當普通打開方式時,拖動文件會進入PictureBox的Drag事件里 (註:PictureBox控制項在設計器里沒有Drag的事件,但不代表不支援,可以在控制項初始化後用程式碼進行+=事件綁定)

當超級管理員打開,會進入Form窗體的Drag事件里。

在Drag_Enter加入 如下程式碼

 Drag_Drop 里獲取拖動進來的文件或文件夾等路徑數組。判斷是否是文件 用 File.Exists 

1 string[] files = e.Data.GetData(typeof(string[])) as string[];
FileDropHandler.cs 文件下載地址:
//download.csdn.net/download/jiang2012yun/12753362