zoukankan      html  css  js  c++  java
  • 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事件不触发的解决

  • 相关阅读:
    代码记录——phase16,block36
    代码记录——phase16,block32
    旋转中建立一个新的数组来存原图数据,测试
    微信小程序:工具配置 project.config.json
    微信小程序:全局配置app.json
    Python3:Requests模块的异常值处理
    微信小程序:本地资源图片无法通过 WXSS 获取,可以使用网络图片或者 base64或者使用image标签
    快速制作一款高逼格词云图
    jQuery事件
    jQuery:$(document).ready()用法
  • 原文地址:https://www.cnblogs.com/arxive/p/5912151.html
Copyright © 2011-2022 走看看