Win7下的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);    

   

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

  

时间: 2024-09-20 05:51:06

Win7下的DragDrop事件不触发?的相关文章

c#3-求好心人帮忙看下事件不触发

问题描述 求好心人帮忙看下事件不触发 C.MOUSEDOWN事件怎么都不触发求大神帮忙看下谢谢啊看看谢谢搞了几天--看下看看谢谢搞了几天--看下 解决方案 看下事件有没有挂钩到事件处理函数 解决方案二: 代码都不帖,怎么帮你看? 解决方案三: 你先把代码贴出来啊 ,没有代码 怎么看 解决方案四: 求帮忙----------------------

图片-事件不触发求帮忙看下

问题描述 事件不触发求帮忙看下 那个c.mousedown事件不触发 解决方案 c在哪里,哪个窗口是f 解决方案二: 求帮忙----------------------

win7下0xc000000e错误故障的解决

当电脑遭遇带突击事件会导致Windows系统的引导程序无法正常工作,Win7下无法正常启动并且同时报告"0xc000000e"错误,遭遇到0xc000000e的错误,我们无法进入安全模式,下面笔者来讲讲不用重装系统也能解决0xc000000e的错误故障. 0xc000000e的错误 先通过修改BIOS将U盘设置为第一启动设备,然后利用U盘版的WinPE启动系统并运行WinPE系统下的命令提示符工具:再在光标所处的位置依次输入以下DOS命令(每输入一条DOS命令都要按下回车键): cd

delphi-想实现win7下触摸屏反馈声音

问题描述 想实现win7下触摸屏反馈声音 鼠标点击操作发声可以实现,但触摸屏触摸时发声不行,是不是API不一样.谁能帮忙写个在安装win7触摸屏电脑上(23寸联想一体机内置电容触摸屏)触摸时会发出反馈声音的小程序代码,c# delphi都行感激不尽. 解决方案 http://www.dotblogs.com.tw/optimist9266/archive/2011/06/07/27309.aspx hook鼠标事件,然后加上发声的代码 解决方案二: 谢谢你的回帖,你这个适用鼠标,但不适用触摸操作

控件-求助:button点击事件无法触发

问题描述 求助:button点击事件无法触发 前台是这样的 已选择: </ul> <asp:Button ID="btn_update_app" runat="server" Text="确定" onclick="btn_confirm_Click" /> <input id="Button3" type="button" value="取消&qu

点击label时click事件被触发两次的坑

原文:点击label时click事件被触发两次的坑 今天帮群里的朋友看一段代码的时候偶然间遇到一个label的坑,点击label的时候,监听的click事件被执行两次: 具体代码如下: 1 <div id="test"> 2 <input type="checkbox" name="abc" id="abc"/> 3 <label for="abc">3423432432

jquery easyui-为什么我的按钮单击事件要触发两次

问题描述 为什么我的按钮单击事件要触发两次 <table id="mingxi"></table> <div id="div_chongzhi_shenqing" align="center"> <div style=" margin-top:50px"> 充值金额:<input type="text" id="chongzhi_money_s

html5-jq中的click事件无法触发是什么原因?

问题描述 jq中的click事件无法触发是什么原因? 写成 $("#btn1").click(function(){ ............... }); 无法触发,提示里也没有click 而在button中添加onclick="btn()",jq中写成 function btn(){ ............... } 就能触发 求大神帮忙看看是什么原因,谢谢了 解决方案 你点击选定的标签是ajax添加的吧,如果是,就不能用: $("#btn1&quo

win7下使用U盘安装Ubuntu Kylin完全详解教程

安装失败了好几次,看了很多篇博客,最后终于成功了,并且做了这个win7下使用U盘安装Ubuntu的教程,希望能给大家带来帮助! 详细的图文步骤如下: 部分操作步骤转自 http://blog.csdn.net/dreamthen/article/details/8765472,感谢. 1.本次使用的是64位的ubuntu Kylin桌面版,iso镜像可以自己去官网下载,大约700MB 2.  将系统拷进U盘,制成u盘启动系统. 4.将电脑划分出来一个空盘,大小20G 足矣,也可以根据个人喜好,分