Win7下的DragDrop事件不触发?

简介:   Win7与原来的XP和Win2003相比,安全控制方面更严格。比如,当我们以administrator登陆XP或Win2003时,运行所有的程序即是以管理员的身份启动的。但当以administrator登陆Win7时,通常状态下,运行普通程序是以普通用户的身份启动的。

  Win7与原来的XP和Win2003相比,安全控制方面更严格。比如,当我们以administrator登陆XP或Win2003时,运行所有的程序即是以管理员的身份启动的。但当以administrator登陆Win7时,通常状态下,运行普通程序是以普通用户的身份启动的。当我们的WinForm应用程序需要以管理员的身份运行时(比如,为了访问windows注册表),我们需要在程序清单(app.manifest文件)中将UAC选项改为"requireAdministrator"(可以参考如何自动以管理员身份运行.NET程序?)。如此生成的exe的图标在XP和Win2003下是没有变化的,但是放到win7下面,你会发现图标的右下角多了一个小盾牌,如下图:

  

  如果同时你的应用程序需要从windows资源管理器拖动文件到你的WinForm上,你会发现原本在XP和Win2003下运行很正常的程序,结果到了win7下就不支持拖拽了,DragEnter/DragOver/DragDrop等事件统统都不被触发。

 

  是什么原因导致这个问题了?

  这是因为windows规定:当拖放源与目标运行的安全级别(隔离级别)不一致时,是禁止拖放的。即,我们的windows资源管理器是以普通用户的身份运行的,而此时我们的应用程序是以管理员身份运行的,两个安全级别不一样,所以不能拖放了。而在XP和Win2003,我们本来就是以管理员登陆的,资源管理器和我们的应用程序都是以管理员身份运行的,所以拖放就是正常工作的。

 

  如何解决Win7下这个拖拽的问题了?

(1)方法一,修改你的应用程序,使之能以普通用户的身份正常运行;

(2)方法二,调整程序结构,把界面部分做成普通权限启动,后台再做一个服务来运行高安全性的操作,两者可以通过类似Remoting的技术来通信。

(3)方法三,修改Windows的MessageFilter,像下面这样:

 [DllImport( " user32.dll " , SetLastError  =   true )]
 static   extern  IntPtr ChangeWindowMessageFilter( uint  message,  uint  dwFlag);

 
uint  WM_DROPFILES  =   0x0233 ;
 
uint  WM_COPYDATA  =   0x4A ;
 
uint  MSGFLT_ADD  =   1 ;

 ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
 ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
 ChangeWindowMessageFilter(
0x0049 , MSGFLT_ADD);    

   

  如果有更好的方法,请留言。

  

目录
相关文章
|
5月前
|
小程序 UED 开发者
小程序如何监听页面的滚动事件
小程序如何监听页面的滚动事件
172 0
如何让touchmove之后不触发touchend的事件
如何让touchmove之后不触发touchend的事件
57 0
|
5月前
[Qt5] 鼠标响应事件和计时器事件
[Qt5] 鼠标响应事件和计时器事件
51 0
|
图形学
Unity碰撞事件和触发事件
大家在刚开始接触Unity的时候,一定要理解碰撞与触发
499 0
Unity碰撞事件和触发事件
VBS调用keybd_event事件
----------------发送alt+v组合按键----------------------Set Wrap = CreateObject("DynamicWrapper") Wrap.Register "USER32.
1103 0
|
小程序
小程序 事件
 什么是事件 事件是视图层到逻辑层的通讯方式。 事件可以将用户的行为反馈到逻辑层进行处理。 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。 事件对象可以携带额外信息,如 id, dataset, touches。
942 0