Win7/Win8/Win8.1/Win10下的DragDrop事件不触发
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,像下面这样: staticexternIntPtrChangeWindowMessageFilter(uintmessage,uintdwFlag); uintWM_DROPFILES=0x0233; uintWM_COPYDATA=0x4A; uintMSGFLT_ADD=1; ChangeWindowMessageFilter(WM_DROPFILES,MSGFLT_ADD); ChangeWindowMessageFilter(WM_COPYDATA,MSGFLT_ADD); ChangeWindowMessageFilter(0x0049,MSGFLT_ADD);
如果有更好的方法,请留言。 http://www.csharpwin.com/csharpspace/12535r1065.shtml
本博客所有内容均对所有人无条件共享,欢迎学习或转载,同时也希望您也加入我们一起推动知识界的共享。www.houfb.cn
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Windows Phone 8.1和Windows Phone Silverlight 8.1之间的区
- windows-server-2012 – 在Win2012 R2中创建RDS服务器场
- haskell – Windows中的着色控制台输出
- 二十三种设计模式[18] - 备忘录模式(Memento Pattern)
- Win32套接字与命名管道
- windows-server-2003 – 确定谁以管理员权限运行?
- Windows系统下如何卸载干净mysql
- windows-server-2008 – HTTP错误503.该服务不可用.在带有i
- cmd – 如何在Windows 7中永久自定义命令提示符的窗口大小/
- .net – 我应该在Windows消息框中使用警告图标或问号图标吗