某些环境下(如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 选择文件夹的解决方法相关推荐

  1. linux没有jre文件夹,linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法...

    linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法 出现这个问题可能有以下几种原因: 1.对该文件没有执行的权限. 2.我们的机器是64位的,而下载的jdk是32位的. 我就是后一 ...

  2. 移动文件需要计算机管理员权限,win7系统提示“需要管理员权限才能移动文件夹”的解决方法...

    很多小伙伴都遇到过win7系统提示"需要管理员权限才能移动文件夹"的困惑吧,一些朋友看过网上零散的win7系统提示"需要管理员权限才能移动文件夹"的处理方法,并 ...

  3. win7计算机c盘搜索不到,win7系统上找不到C盘上的programdata文件夹的解决方法

    在win7电脑系统上的C盘上的ProgramData文件夹是win7电脑中一个很重要的文件夹,它是公用的被创建文件夹或文件存放的地方.但是,最近有朋友反映自己升级系统后,突然找不到C盘上的progra ...

  4. Win11无法删除文件夹怎么办?Win11无法删除文件夹的解决方法

    ​虽然Win11系统已经推出很长一段时间了,但很多小伙伴在使用的过程中还是会遇到各种问题,例如在删除文件夹的时候会出现发无法删除的情况,那么遇到这种情况应该怎么办呢?下面就和小编一起来看看有什么解决方 ...

  5. win10 服务器文件夹权限,Win10无权限也能访问特殊文件夹的解决方法

    用户在操作Win10系统的时候也会遇到一些故障问题,比如在修改文件夹位置的时候,一般是需要访问权限才可以.但是一些用户说没有任何访问或使用权限,也可以打开和浏览了,这样很容易泄露隐私安全.有什么办法可 ...

  6. mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法)

    mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法) 参考文章: (1)mysql8.0.18ZIP版下载与安装(以及无my-default.i ...

  7. python listdir() 中文路径 中文文件夹 乱码 解决方法

    python listdir() 中文路径 中文文件夹 乱码 解决方法 参考文章: (1)python listdir() 中文路径 中文文件夹 乱码 解决方法 (2)https://www.cnbl ...

  8. win10文件夹拒绝访问怎么办?windows拒绝访问文件夹的解决方法

    当我们每天使用win10系统计算机时,许多用户遇到了windows拒绝访问文件夹的问题.以下小编就带给大家拒绝访问文件夹怎么解决的具体方法,有兴趣的小伙伴赶紧来看看. ①右键点击打不开的文件夹,选择属 ...

  9. win7计算机c盘搜索不到,win7系统C盘搜索不到system32文件夹的解决方法

    很多小伙伴都遇到过win7系统C盘搜索不到system32文件夹的困惑吧,一些朋友看过网上零散的win7系统C盘搜索不到system32文件夹的处理方法,并没有完完全全明白win7系统C盘搜索不到sy ...

最新文章

  1. 分享Kali Linux 2017年第30周镜像文件
  2. tomact如何处理一个http请求?
  3. 思科交换机ping得通 traceroute不通_网络中经常接触的Ping 一次性教你弄懂如何检测三层网络...
  4. VMware 创建开启虚拟机时候报错的解决方式
  5. qt 消息处理机制与window消息处理机制的比较
  6. 启动“powershell.exe”时出现错误 0x8007000
  7. Oracle数据库管理与开发pdf
  8. esxi 安装网卡驱动
  9. element-ui 源码学习
  10. 键盘可以实现向计算机输入数据判断,计算机应用基础—学习指南.docx
  11. ubuntu系统重装恢复步骤
  12. 微信小程序之订阅消息
  13. .net 简单的后台合成图片
  14. 使用MindSpore进行一阶导数计算
  15. vue移动端开启键盘 页面底部样式乱了
  16. Ubuntu安装flash
  17. react render相关 【类组件、函数组件 】
  18. java爬移动端搜索引擎_尝试java开发搜索引擎爬虫
  19. 前端零基础入门_000_前言
  20. 父母教养方式与幼儿焦虑关系的三水平元分析

热门文章

  1. java数据库视图工具_数据库视图工具类
  2. 中山网络推广浅谈网站为什么迟迟不收录?该怎么办?
  3. 网站页面内链如何布局才更有利于SEO?
  4. 思科ucs-b系列服务器,思科统一计算系统UCS B系列刀片推荐
  5. 东芝2505扫描软件_东芝P300机械硬盘上膛体验:内存大了,小姐姐再也不愁无处安放了...
  6. springboot 自动装配_Spring Boot 自动装配流程
  7. 八皇后时间复杂度_LeetCode46:全排列(八皇后)
  8. 开发日记-20190827 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 3
  9. python爬取电影网站信息并写入文件
  10. 【数据结构】二分查找