win7系统,包括win8、win10,当一个软件以管理员身份运行后,文件拖放打开功能将失效,只能从软件菜单来打开文档,特别麻烦。原因:win7系统后,微软增加了“UI消息隔离机制(UMI)”,低权限进程无法和高权限进程进行通信,explorer.exe(图形外壳进程)进程权限并非是完全管理员权限,所以它不能向管理员(Administrator)权限进程发送消息,而文件拖动会发送一个WM_DROPFILES消息出去,当前进程是高权限进程,所以收不到WM_DROPFILES消息。
解决办法:1.开发者角度,win7/8/10,调用ChangeWindowMessageFilter或者ChangeWindowMessageFilterEx即可,xp下不存在该机制,无需调用,也无法调用(xp版user32.dll中根本没有该函数)。
在程序启后调用:
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD); // MSGFLT_ADD=0x1 MSGFLT_REMOVE=0x2
ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD); // WM_COPYGLOBALDATA=0x0049
2.用户角度,修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System下的EnableLUA值为0,重启电脑。该操作用于禁用LUA(Least-privilege User Account,最低权限用户账户),然后运行UserAccountControlSettings.exe,关闭UAC(User Account Control,用户账户控制)。个人感觉UAC和UMI就是累赘,为了安全,却降低工作效率,如今杀软已经烂大街了,系统的保护完全没必要。