通过浏览器加载程序选择文件路径方法
2017-01-09 16:52
316 查看
通过浏览器浏览器选择预览文件存储路径
在工作中遇到这个需求,需要选择文件的存储这里我列举两种方法供大家参考:
1、通过SHBrowseForFolder实现具体代码和讲解如下:
在工作中遇到这个需求,需要选择文件的存储这里我列举两种方法供大家参考:
1、通过SHBrowseForFolder实现具体代码和讲解如下:
wchar_t szPath[MAX_PATH]; //存放选择的目录路径 ZeroMemory(szPath, sizeof(szPath)); BROWSEINFO bi; memset(&bi, 0, sizeof(BROWSEINFO)); DWORD dwPid = GetPidByProcessName(_T("firefox.exe"));//这个更具不用设置不同父类句柄,我不想在任务栏中显示出来,所以我把他的父类句柄设置称浏览器 HWND hWnd = GetHwndByPid(dwPid); bi.hwndOwner = hWnd; bi.pidlRoot = NULL; bi.pszDisplayName =szPath; bi.lpszTitle = L"保存的目录:"; bi.ulFlags = 0; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; LPITEMIDLIST lp = SHBrowseForFolder(&bi); if (lp) { bool list = SHGetPathFromIDList(lp, szPath); //打开成功 } else { //打开失败 }2、通过GetOpenFileName函数实现,这个实现方法需要增加对话框和消息钩子进行处理
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_ENABLEHOOK | OFN_HIDEREADONLY | OFN_CREATEPROMPT | OFN_SHAREAWARE | OFN_ENABLESIZING; openFile.hInstance = (HMODULE)GetCurrentProcess(); openFile.lpfnHook = MyFolderProc; if (GetOpenFileName(&openFile)) { strDir = wstring2string(szFileName); } else { DWORD ret = CommDlgExtendedError(); strDir = str; }
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按钮等控件的消息在父窗口处理。 LogInfo("MyFolderProc\n"); 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; }通过以上两种方式都可以浏览文件夹去保存文件
相关文章推荐
- 对于当浏览器通过ajax加载的文件还是修改前的文件的处理方法
- 通过AS3加载外部SWF文件,调用外部文件文档类的方法
- 转载:一种不通过程序来实现写作和阅读文件的方法
- 如何通过AS3加载外部SWF文件,调用外部文件文档类的方法?
- IIS7出现未能加载文件或程序集“XXX.XXX”或它的某一个依赖项。试图加载格式不正确的程序的解决方法
- “未能加载文件或程序集“AspNetPager”或它的某一个依赖项。系统找不到指定的路径。”的解决方法
- AutoCAD2014 加载第三方的程序,弹出“可执行文件超出指定的受信任的位置”的解决方法
- VC下通过进程ID获取进程镜像文件路径的方法及其存在的缺陷
- 通过浏览器访问 memcache.php提示找不到该文件, 注意 httpd.conf 的 “documentroot”路径
- 利用input type=file和FileReader API实现在浏览器客户端通过选择对话框读取文件
- Java 多文件上传存储到不同的路径及某上传框中未选择上传文件的处理方法
- 如何通过AS3加载外部SWF文件,调用外部文件文档类的方法?
- jquery 兼容各种浏览器select动态加载选择的方法
- 【收藏】各种浏览器下用JS获取文件域的文件路径的方法
- 利用javascript使html的file不可手动输入文件路径,只可通过[浏览]按钮选择
- C#窗体应用程序中 浏览本地文件 或 选择本地文件路径 的方法
- 程序获取eclipse工程下文件路径的解决方法
- 通过 HTTP 加载 XML 文件时 Load 方法失败
- java程序中获取项目或者目录或者文件路径的方法
- 如何通过AS3加载外部SWF文件,调用外部文件文档类的方法?