GetOpenFileName 选择文件夹的解决方法
某些环境下(如WIN PE)windows自带的选择文件夹api不能使用或者体验不佳。现在利用GetOpenFileName的回掉参数实现了选择文件夹选择功能。
#include <Windows.h> #include <CommCtrl.h> #include <locale.h> #include <shlwapi.h> LONG g_lOriWndProc = NULL; #define ID_COMBO_ADDR 0x47c #define ID_LEFT_TOOBAR 0x4A0 LRESULT static __stdcall _WndProc ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {switch(uMsg){case WM_COMMAND:{if( wParam == IDOK ){wchar_t wcDirPath[MAX_PATH] = {0};HWND hComboAddr = GetDlgItem(hwnd, ID_COMBO_ADDR);if (hComboAddr != NULL){GetWindowText(hComboAddr, wcDirPath, MAX_PATH);}if (!wcslen(wcDirPath)){break;}DWORD dwAttr = GetFileAttributes(wcDirPath);if(dwAttr != -1 && (FILE_ATTRIBUTE_DIRECTORY & dwAttr)){LPOPENFILENAMEW oFn = (LPOPENFILENAME)GetProp(hwnd, L"OPENFILENAME");if (oFn){int size = oFn->nMaxFile > MAX_PATH?MAX_PATH: oFn->nMaxFile;memcpy(oFn->lpstrFile, wcDirPath, size * sizeof(wchar_t));RemoveProp(hwnd, L"OPENFILENAME");EndDialog(hwnd, 1);}else{EndDialog(hwnd, 0);}}break;}////如果是左边toolbar发出的WM_COMMOND消息(即点击左边的toolbar), 则清空OK按钮旁的组合框。HWND hCtrl = (HWND)lParam;if (hCtrl == NULL){break;}int ctrlId = GetDlgCtrlID(hCtrl);if (ctrlId == ID_LEFT_TOOBAR){HWND hComboAddr = GetDlgItem(hwnd, ID_COMBO_ADDR);if (hComboAddr != NULL){SetWindowTextW(hComboAddr, L"");}}}break;} int i = CallWindowProc( (WNDPROC) g_lOriWndProc , hwnd, uMsg, wParam ,lParam );return i; } UINT_PTR static __stdcall MyFolderProc( HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam ) {//参考reactos可知,hdlg 是一个隐藏的对话框,其父窗口为打开文件对话框, OK,CANCEL按钮等控件的消息在父窗口处理。if(uiMsg == WM_NOTIFY){LPOFNOTIFY lpOfNotify = (LPOFNOTIFY)lParam;if (lpOfNotify->hdr.code == CDN_INITDONE ){SetPropW(GetParent(hdlg), L"OPENFILENAME", (HANDLE)(lpOfNotify->lpOFN));g_lOriWndProc = ::SetWindowLongW( ::GetParent( hdlg ), GWL_WNDPROC , (LONG)_WndProc ); }if (lpOfNotify->hdr.code == CDN_SELCHANGE){wchar_t wcDirPath[MAX_PATH] = {0};CommDlg_OpenSave_GetFilePathW(GetParent( hdlg ), wcDirPath, sizeof(wcDirPath)); HWND hComboAddr = GetDlgItem(GetParent(hdlg), ID_COMBO_ADDR);if (hComboAddr != NULL){if (wcslen(wcDirPath)){//去掉文件夹快捷方式的后缀名。int pathSize = wcslen(wcDirPath);if (pathSize >= 4){wchar_t* wcExtension = PathFindExtensionW(wcDirPath);if (wcslen(wcExtension)){wcExtension = CharLowerW(wcExtension);if(!wcscmp(wcExtension, L".lnk")){wcDirPath[pathSize - 4] = L'\0';}}}SetWindowTextW(hComboAddr, wcDirPath);}else{SetWindowTextW(hComboAddr, L"");} }}}return 1; }int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL,"chs");OPENFILENAMEW openFile;memset(&openFile, 0, sizeof(openFile));openFile.lStructSize = sizeof(openFile);wchar_t szFileName[MAX_PATH]={0}; OPENFILENAME openFileName = {0}; openFile.lStructSize = sizeof(OPENFILENAME); openFile.nMaxFile = MAX_PATH;openFile.lpstrFilter = L"文件夹\0..\0\0"; openFile.lpstrFile = szFileName; openFile.nFilterIndex = 1; openFile.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST |OFN_ENABLEHOOK | OFN_HIDEREADONLY; openFile.hInstance = (HMODULE)GetCurrentProcess();openFile.lpfnHook = MyFolderProc; BOOL b = GetOpenFileNameW(&openFile);wprintf(L"%d %s\n", b,szFileName);system("pause");return 0; }
参考:http://blog.csdn.net/norsd/article/details/3476606
转载于:https://www.cnblogs.com/kocpp/p/5349467.html
GetOpenFileName 选择文件夹的解决方法相关推荐
- linux没有jre文件夹,linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法...
linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法 出现这个问题可能有以下几种原因: 1.对该文件没有执行的权限. 2.我们的机器是64位的,而下载的jdk是32位的. 我就是后一 ...
- 移动文件需要计算机管理员权限,win7系统提示“需要管理员权限才能移动文件夹”的解决方法...
很多小伙伴都遇到过win7系统提示"需要管理员权限才能移动文件夹"的困惑吧,一些朋友看过网上零散的win7系统提示"需要管理员权限才能移动文件夹"的处理方法,并 ...
- win7计算机c盘搜索不到,win7系统上找不到C盘上的programdata文件夹的解决方法
在win7电脑系统上的C盘上的ProgramData文件夹是win7电脑中一个很重要的文件夹,它是公用的被创建文件夹或文件存放的地方.但是,最近有朋友反映自己升级系统后,突然找不到C盘上的progra ...
- Win11无法删除文件夹怎么办?Win11无法删除文件夹的解决方法
虽然Win11系统已经推出很长一段时间了,但很多小伙伴在使用的过程中还是会遇到各种问题,例如在删除文件夹的时候会出现发无法删除的情况,那么遇到这种情况应该怎么办呢?下面就和小编一起来看看有什么解决方 ...
- win10 服务器文件夹权限,Win10无权限也能访问特殊文件夹的解决方法
用户在操作Win10系统的时候也会遇到一些故障问题,比如在修改文件夹位置的时候,一般是需要访问权限才可以.但是一些用户说没有任何访问或使用权限,也可以打开和浏览了,这样很容易泄露隐私安全.有什么办法可 ...
- mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法)
mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法) 参考文章: (1)mysql8.0.18ZIP版下载与安装(以及无my-default.i ...
- python listdir() 中文路径 中文文件夹 乱码 解决方法
python listdir() 中文路径 中文文件夹 乱码 解决方法 参考文章: (1)python listdir() 中文路径 中文文件夹 乱码 解决方法 (2)https://www.cnbl ...
- win10文件夹拒绝访问怎么办?windows拒绝访问文件夹的解决方法
当我们每天使用win10系统计算机时,许多用户遇到了windows拒绝访问文件夹的问题.以下小编就带给大家拒绝访问文件夹怎么解决的具体方法,有兴趣的小伙伴赶紧来看看. ①右键点击打不开的文件夹,选择属 ...
- win7计算机c盘搜索不到,win7系统C盘搜索不到system32文件夹的解决方法
很多小伙伴都遇到过win7系统C盘搜索不到system32文件夹的困惑吧,一些朋友看过网上零散的win7系统C盘搜索不到system32文件夹的处理方法,并没有完完全全明白win7系统C盘搜索不到sy ...
最新文章
- 分享Kali Linux 2017年第30周镜像文件
- tomact如何处理一个http请求?
- 思科交换机ping得通 traceroute不通_网络中经常接触的Ping 一次性教你弄懂如何检测三层网络...
- VMware 创建开启虚拟机时候报错的解决方式
- qt 消息处理机制与window消息处理机制的比较
- 启动“powershell.exe”时出现错误 0x8007000
- Oracle数据库管理与开发pdf
- esxi 安装网卡驱动
- element-ui 源码学习
- 键盘可以实现向计算机输入数据判断,计算机应用基础—学习指南.docx
- ubuntu系统重装恢复步骤
- 微信小程序之订阅消息
- .net 简单的后台合成图片
- 使用MindSpore进行一阶导数计算
- vue移动端开启键盘 页面底部样式乱了
- Ubuntu安装flash
- react render相关 【类组件、函数组件 】
- java爬移动端搜索引擎_尝试java开发搜索引擎爬虫
- 前端零基础入门_000_前言
- 父母教养方式与幼儿焦虑关系的三水平元分析
热门文章
- java数据库视图工具_数据库视图工具类
- 中山网络推广浅谈网站为什么迟迟不收录?该怎么办?
- 网站页面内链如何布局才更有利于SEO?
- 思科ucs-b系列服务器,思科统一计算系统UCS B系列刀片推荐
- 东芝2505扫描软件_东芝P300机械硬盘上膛体验:内存大了,小姐姐再也不愁无处安放了...
- springboot 自动装配_Spring Boot 自动装配流程
- 八皇后时间复杂度_LeetCode46:全排列(八皇后)
- 开发日记-20190827 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 3
- python爬取电影网站信息并写入文件
- 【数据结构】二分查找