C#.WinForm 拖動檔案到PictrueBox(支援跨UAC拖動)

雲瑞發表於2020-08-26

如程式以普通方式開啟,那麼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 檔案下載地址:
https://download.csdn.net/download/jiang2012yun/12753362

相關文章