VC/MFC 实现文件拖拽获取文件名(WM_DROPFILES)

来源:互联网 发布:商城首页广告设计 php 编辑:程序博客网 时间:2024/05/21 02:20

本文实现的是:拖拽文件到对话框(MFC)的编辑框,然后在编辑框中显示文件名。


首先说一下我的失败经历:

操作系统环境:win10,VS版本:Visual Studio 10,无论程序是基于单文档的还是对话框的,都不能实现文件拖拽。难道是VS10的问题?或者是没有用“管理员权限”启动导致的原因?经过多次尝试后,决定换VS08试试!代码完全一样,结果在VS08下可以实现文件拖拽。神马问题?


下面说一下,实现对话框的文件拖拽的方法:

1、对话框和编辑框的属性中,Accept Files,设为true。或者用代码 DragAcceptFiles(TRUE);来设置属性!

2、用类向导重载一个Edit类,命名为CDragEdit,然后添加 WM_DROPFILES 事件:

void CDragEdit::OnDropFiles(HDROP hDropInfo){TCHAR szPath[MAX_PATH] = {0};UINT nCount = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);for(UINT i = 0; i < nCount; ++i) { DragQueryFile(hDropInfo, i, szPath, MAX_PATH); //MessageBox(szPath);}DragFinish(hDropInfo);SetWindowText(szPath);UpdateData(FALSE);//CEdit::OnDropFiles(hDropInfo);}
3、在对话框中,为编辑框添加控件类型的变量 CDragEdit m_editResPath; 然后就OK拉!

4、至于之前提到的在VS10版本不能实现,暂时无从知晓!

---------------------------------------------------------2017/04/14---------------------------------------------------------------

针对第4点(在VS10版本中不能实现文件拖放),这里稍微再做一下讨论。

如果无法实现文件拖放,不妨在程序初始化的时候,加上下面两句代码:

ChangeWindowMessageFilterEx(m_hWnd, WM_DROPFILES, MSGFLT_ALLOW, NULL);
ChangeWindowMessageFilterEx(m_hWnd, 0x0049, MSGFLT_ALLOW, NULL);// 0x0049 == WM_COPYGLOBALDATA

        本质问题不是VS10的问题,而是win7的用户权限问题。基于 Windows XP 应用程序经常需要互相之间能传递消息,Windows Vista 引入了 Change WindowMessageFilter(UINT message, UINT dwFlag)编程接口,用来添加或删除隔离级别的消息。Windows 7 引入一个新的编程接口 ChangeWindowMessageFilterEx(HWND hWnd, UINT message, DWORD action,PCHANGEFILTERSTRUCT pChangeFilterStruct),事件的参数可以是 MSGFLT_ALLOW、MSGFLT_DISALLOW 和 MSGFLT_RESET,将窗口重设成默认筛选器,可选的架构允许操作结果以接收更多的信息。通过在高权限进程中对指定的某一个低权限进程所创建的窗口进行这样的设置,则低权限进程就可以通过发消息的形式与高权限进程通信了。

  explorer.exe 进程是微软为其Windows操作系统定义的的系统核心进程,它是较老的Windows 3.x文件管理器的替代品,在后来的系统中微软将其称为“Windows 资源管理器”。在功能上,explorer.exe进程为用户提供了图形用户界面(也称为图形壳),简单的说就是用来显示系统的桌面环境的,包括开始菜单、桌面下方的任务栏、桌面图标和文件管理。

  文件管理是 explorer.exe 进程众多功能之一,平常我们双击桌面上的程序快捷方式或从资源管理器里双击某个文件以打开之,一般explorer.exe进程便会创建相应的程序进程,也就是说explorer.exe进程是你手动打开的程序进程的父进程。

        我们从【桌面】或从【资源管理器】里用鼠标拖放文件到程序窗口上,其实就是【explorer.exe】和“自己程序”两个进程之间的通信,也即【explorer.exe】向“自己程序”发送【WM_DROPFILES】消息。在 XP 系统下,两者无任何代沟,能顺利收发消息;而在 Win7 系统下,彼此能够收发消息,则没那么容易了,导致收发消息不畅的“第三者”便是MIC(消息完整性检查)和UIPI(用户界面特权隔离)。

        用户界面特权隔离(User Interface Privilege Isolation),则是 Windows 7 通过 MIC 机制新引入的一种安全特性,用于拦截接收比自身进程 MIC 等级低的进程发来的消息。

        消息完整性检查(Message Integrity Check),是 Windows 7 增加的 Windows 安全对象访问控制安全机制,系统利用完整性级别对一个安全对象进行标记,通过降低进程的完整性级别可以限制其对安全对象的写入权限,这一点类似于用户帐户组的成员被限制访问系统组件这种方式。完整性检查机制使得用更少的权限或以更低的完整性级别运行一些程序,会降低进程修改系统或损害用户数据文件的可能性。


0 0
原创粉丝点击