解决Duilib集成CEF浏览器在Win10无法向客户区拖拽文件

在Duilib中集成CEF浏览器项目实际开发中,遇到一个问题。

一个需求从资源管理器(桌面)拖拽文件到客户端,窗口捕获WM_DROPFILES消息然后进行消息处理,但客户区是集成的CEF浏览器,浏览器自身有拖拽事件,要想响应WM_DROPFILES消息,必须屏蔽浏览器拖拽事件,如何屏蔽浏览器拖拽事件参考我之前写的博客,因为Win10系统权限的原因,程序安装在C盘,程序运行过程中在系统盘进行文件操作(读写操作),必须拥有管理员权限,一个让程序拥有管理员权限办法是工程属性中直接设置,这样编译出来的exe运行需要有管理员权限。

需求示意图:

 

 

 

但是这样设置后,在Win7系统下无法响应WM_DROPFILES,这个参考http://www.cnblogs.com/chechen/p/5941194.html解决Win7无法响应的问题。

上面这些问题都解决了,可在Win10拖拽文件在浏览器客户端去无法响应,后来把UAC又设置成asInvoker,在Win10下又可以了。在此先记录一下。

 补充:后来通过查资料发现,出现这个问题有两点原因造成的

          1.我测试后发现Win10系统当前登录的是管理员帐号(参考我博客:Windows登录用户类型);桌面是在普通用户权限下(Explorer 默认MIC等级是中级)

          2.我的程序是以管理员运行,MIC等级是高级

          因此我们拖拽文件到客户端浏览器区域没法响应拖拽消息,因为浏览器区域的窗口没有修改 UIPI【用户界面特权隔离】消息过滤器,WM_DROPFILES消息被过滤了。

          这个问题不是Win10独有的,因为我的开发环境是Win7下超级管理员登录,权限最高的用户,当程序以管理员运行时拖拽到客户端能响应拖拽消息,我猜测explorer在超级管理员下的MIC等级是高级,所以才能通信成功。

 知识点回忆:我们从【桌面】或从【资源管理器】里用鼠标拖放文件到程序窗口上,其实就是【explorer.exe】和【测试[WM_DROPFILES]消息.exe】两个进程之间的通信

用户界面特权隔离(User Interface Privilege Isolation),则是 Windows 7 通过 MIC 机制新引入的一种安全特性,用于拦截接收比自身进程 MIC 等级低的进程发来的消息。UIPI 的目的是为了规范不同进程窗口之间的窗口消息处理过程,默认情况下,高权限进程不会接收到低权限进程发送的窗口消息的,但是低权限进程能够接收到高权限进程的窗口消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值