zoukankan      html  css  js  c++  java
  • C#.WinForm 拖动文件到PictrueBox(支持跨UAC拖动)

    如程序以普通方式打开,那么DragDrop DragEnter 事件是可以正常使用的。但以管理员身份运行时,这两个方法将失效。

    原因是 Windows机制(用户界面特权隔离).

     UIPI:用户界面特权隔离(User Interface Privilege Isolation),是 Windows 7 通过 MIC 机制新引入的一种安全特性,用于拦截接收比自身进程 MIC 等级低的进程发来的消息。UIPI 的目的是为了规范不同进程窗口之间的窗口消息处理过程,默认情况下,高权限进程不会接收到低权限进程发送的窗口消息的,但是低权限进程能够接收到高权限进程的窗口消息。UIPI 的本质是系统检查目标窗口和发送方是否具有相同的 MIC 等级或者发送方具有更高的 MIC 等级,如果符合上述条件,则允许消息的传递,否则将消息丢弃。
     因此,在 Windows 7 操作系统中运行的用户进程,如果运行时具有不同的完整性等级,即具有不同的 MIC 等级,那么相互间的通信将会无法像 Windows XP 那样正常进行。

    解决方案:

    采用 ChangeWindowMessageFilterEx 函数,为指定窗口修改用户界面特权隔离 (UIPI) 消息过滤器。

    通俗点就是 用于过滤指定句柄 的 低权限向高权限发送消息不成功的限制.

    网上淘了了一个类可供参考,下载地址文章末尾。

    使用方法:

    在窗体内定义变量 

    1 public FileDropHandler FileDroper = null;

    在窗体加载Load方法加入 

    1  FileDroper = new FileDropHandler(this);
    2  FileDroper = new FileDropHandler(pictureBox1);

    当普通打开方式时,拖动文件会进入PictureBox的Drag事件里 (注:PictureBox控件在设计器里没有Drag的事件,但不代表不支持,可以在控件初始化后用代码进行+=事件绑定)

    当超级管理员打开,会进入Form窗体的Drag事件里。

    在Drag_Enter加入 如下代码

     Drag_Drop 里获取拖动进来的文件或文件夹等路径数组。判断是否是文件 用 File.Exists 

    1 string[] files = e.Data.GetData(typeof(string[])) as string[];
    FileDropHandler.cs 文件下载地址:
    https://download.csdn.net/download/jiang2012yun/12753362
  • 相关阅读:
    使用cd回到上次编辑的目录
    自动机编程
    python日常题目小练习
    python中的循环结构等相关知识
    python中的数学类型及操作
    小白艰难的Python图像的绘制
    小白的第二天之计算机基础及软件安装
    小白的日常练习
    小白的第一天
    协程
  • 原文地址:https://www.cnblogs.com/YunRuiSoftWare/p/13565149.html
Copyright © 2011-2022 走看看