Win7下的DragEnter、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,像下面这样:

[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);

  

本人出现这种问题的原因,经过分析是由于解决方案中有dll项目,所以需要以管理员的方式启动了Visual Studio,来运行解决方案。而该解决方案中的一个窗体进行了Drag的相关操作,导致由于在资源管理器中的权限低于运行的程序的权限,所以无法捕获Drag事件。

参考文章

zhuweisky,Win7下的DragDrop事件不触发的解决

时间: 2024-10-09 03:18:40

Win7下的DragEnter、DragDrop事件不触发的解决的相关文章

win7下qt error: undefined reference to `[email protected]'解决

[email protected]对应着winsock2.h的getnameinfo函数 首先需要导入对应的头文件 #ifndef WIN32 #include <sys/socket.h> #include <netinet/in.h> #else //win7下的头文件 #include <winsock2.h> #include<ws2tcpip.h> #endif 在qt的.pro工程文件中添加ws2_32.lib文件即可. LIBS += -lli

Asp.net_解决在高版本ie浏览器下按钮点击事件不触发

这是微软的一个兼容bug,通过服务器补丁方式解决. 没有此修补程序时出现的常见问题 请考虑下面的方案: 您可以使用 Windows Internet Explorer 10 来访问基于 ASP.NET 网页. 该网页启动回发. 在此方案中,回发发生故障,并且您会收到以下错误消息: 脚本遇到错误","'__doPostBack' 未定义 补丁下载: .NET 4 - http://support.microsoft.com/kb/2600088 .NET 2.0&3.5 - ht

win7下右键“发送到”选项无内容的解决方法

今天网上朋友遇此问题,有趣,故记之. 1.开始-运行,输入:shell:sendto 直接进入%%AppData\Roaming\Microsoft\Windows\SendTo,按shift键+右键, 选择"在此处打开命令窗口",进入如下界面 输入,color>桌面快捷方式.desklink 再到快捷方式文件夹查看(路径是:C:\Users\用户名\AppData\Roaming\Microsoft\Windows\SendTo), 2.若未能解决,可以新建一个文本文档,命名:

win7下80端口被(Pid=4)占用的解决方法

首先介绍一种网上普遍的方法,就是查找占据80端口的进程,然后关闭它就行了. 1.运行cmd,然后输入netstat -a -n -o,回车:2.查看开头几行包含0.0.0.0:80的那一行最后的pid,为几个数字,把这几个数字记下来:3.启动“任务管理器”——“进程”,在“工具栏”——“选择列”前面的框里打上勾:4.然后找到与刚才那个pid对应的是哪个程序,很容易就会找到,就是它与0.0.0.0:80进行了绑定(bind): 结束这个进程,再点击Apache的Start按钮,终于出现了那个Run

IE11在win7下F12查看报错

Diagnostic: Exception in window.onload: Error: An error has occuredJSPlugin.3005 StackTrace; IE11在win7下点击F12报这个错误, 解决方法:安装Windows7补丁:KB3008923: 安装补丁后,页面可以正常加载. 下载地址: http://www.microsoft.com/en-us/download/details.aspx?id=45134  (32位) http://www.micr

jQuery---钢琴案例 (按下1-9数字键,能触发对应的mouseenter事件)

钢琴案例 (按下1-9数字键,能触发对应的mouseenter事件) 1. 结合之前的学习,主要内容,就是on注册keyup事件,函数里传入e, 用e.keyCode,来获取1-9的数字的范围. 如果所按的按键在49-57的范围里,就去触发mouseenter(or mouseleave)事件. 怎么触发呢?让.nav li的索引下标等于(code-49) 2. 设置节流阀 //弹起的时候,触发mouseleave事件 $(document).on("keyup", function

记录一次cefsharp1输入法在win7下异常解决定位

最近几天都被基于cefSharp封装的浏览器控件搞疯了!对于cefSharp基本满足当前所做项目的需求,但是有一个问题一直困扰我,那就是系统中偶尔会出现输入法不能转换到中文.而且这个问题似乎没有什么规律. [项目需求] 先说一下项目对浏览器控件的需求,如果没有需要做听音这个功能,其实项目可以是一个B/S架构.但是由于现在需要听音功能,所以决定使用C/S的架构.其中客户端采用浏览器控件来实现网页加载.客户端主窗口内嵌一个浏览器控件,然后页面有需要听音的时候可以点击听音然后弹出听音窗口.听音窗口又是

html事件-子元素事件不触发父元素事件

<div class="list-row" onclick="showChatDialog('dy','100000001',true);"> <img class="icon" src="/icon/default.ico" onclick="personData(event,100000001);"> <a class="nickname">dy&

彻底解决低端安卓手机touchend事件不触发(考虑scroll)

本次移动端开发时遇见了安卓4.2系统不能触发touchend的问题,有以下需求. 1. 横滑轮播图 2.下拉刷新页面内容 3.body滚动条不能失效 开始在轮播图touchmove事件中阻止了浏览器默认行为,此时touchend事件可以触发. //拖拽轮播图 parentNode.addEventListener('touchmove',function(e) { e.preventDefault(); }) 然后复制了一份在下拉刷新事件中(此时下拉刷新也OK了) //下拉刷新代码 docume