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