前言
最近写的一个小工具因涉及到系统文件的操作,故需要以管理员身份运行,但这影响到了程序的文件拖放功能,即DragDrop
事件。而一番搜索后,发现这个问题还是令很多人感到棘手的,而大部分网友给出的解决方法均是效果不佳。很幸运的是博主发现了一个很稳的解决方法,这里做个记录。
原因
不同权限提升级别的程序之间是无法共享拖放消息的,这就导致了例如RequireAdministrator
权限提升级别的程序读取不到InvokeAsUser
权限提升级别的Windows Explorer
中的文件数据的问题。即低权限的进程无法向高权限的进程发送任何高于WM_USER
的消息,而低于WM_USER
的消息一部分也会因为安全原因被禁止。故同样级别的权限提升账户运行的程序则可以共享拖放消息。
解决
综合原因分析,可以得知通常所用的AllowDrop
只限于同级别权限的程序之间共享消息。故要解决这个问题则可以使用传统的拖放方法,即WndProc
函数中的消息。
这里需要注意的是,此解决方案无需启用控件的AllowDrop
属性。
类
1 | public class ElevatedDragDropManager : IMessageFilter |
使用示例
1 | private void Form1_ElevatedDragDrop(System.Object sender, ElevatedDragDropArgs e) |