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 文件下載地址:
https://download.csdn.net/download/jiang2012yun/12753362

浙公網安備 33010602011771號