在API资源管理器中选择文件夹是一项常见的任务,特别是在需要浏览文件系统、打开项目文件夹或保存数据时,以下是关于如何在API资源管理器中选择文件夹的详细步骤:
浏览文件夹对话框:可以使用SHBrowseForFolder
函数来显示一个浏览文件夹对话框,这个函数允许用户选择一个文件夹,并返回该文件夹的路径。
示例代码:以下是一个使用SHBrowseForFolder
函数的示例代码,它展示了如何创建一个浏览文件夹对话框并获取用户选择的文件夹路径。
#include <windows.h> #include <shlobj.h> #include <iostream> void test_browse() { BROWSEINFO bi; bi.hwndOwner = NULL; bi.pidlRoot = (LPCITEMIDLIST)CSIDL_SYSTEM; // 文件夹的根目录,此处为桌面 bi.pszDisplayName = NULL; bi.lpszTitle = "Test文件浏览"; // 显示位于对话框左上部的提示信息 bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_USENEWUI | BIF_UAHINT; bi.lpfn = NULL; bi.iImage = 0; LPITEMIDLIST pidl = SHBrowseForFolder(&bi); // 调用选择对话框 if (pidl == NULL) { std::cout << "没有选择目录" << std::endl; } else { TCHAR strFolder[MAX_PATH]; SHGetPathFromIDList(pidl, strFolder); std::cout << strFolder << std::endl; } }
获取当前资源管理器窗口:可以通过Shell.Application
对象来获取当前资源管理器窗口,并进一步操作其中的文件夹和文件。
示例代码:以下是一个使用Shell.Application
对象的示例代码,它展示了如何获取当前资源管理器窗口的路径和其中的所有文件及选中的文件。
F1::
path := Explorer_GetPath()
all := Explorer_GetAll()
sel := Explorer_GetSelected()
MsgBox % path
MsgBox % all
MsgBox % sel
return
Explorer_GetPath(hwnd="") {
if !(window := Explorer_GetWindow(hwnd))
return ErrorLevel := "ERROR"
if (window="desktop")
return A_Desktop
path := window.LocationURL
path := RegExReplace(path, "ftp://.*@","ftp://")
StringReplace, path, path, file:///, All
If RegExMatch(path, "i)(?<=%)[da-f]{1,2}", hex)
StringReplace, path, path, `%%hex%, % Chr("0x" . hex), All
Else Break
return path
}
Explorer_GetAll(hwnd="") {
return Explorer_Get(hwnd)
}
Explorer_GetSelected(hwnd="") {
return Explorer_Get(hwnd,true)
}
Explorer_GetWindow(hwnd="") {
WinGet, process, processName, % "ahk_id" hwnd := hwnd? hwnd:WinExist("A")
WinGetClass class, ahk_id %hwnd%
if (class ~= "(Cabinet|Explore)WClass") {
for window in ComObjCreate("Shell.Application").Windows
if (window.hwnd==hwnd)
return window
} else if (class ~= "Progman|WorkerW")
return "desktop" ; desktop found
}
Explorer_Get(hwnd="",selection=false) {
if !(window := Explorer_GetWindow(hwnd))
return ErrorLevel := "ERROR"
if (window="desktop") {
ControlGet, hwWindow, HWND, SysListView321, ahk_class Progman
if !hwWindow ; #D mode
ControlGet, hwWindow, HWND, SysListView321, A
ControlGet, files, List, % ( selection ? "Selected":"") "Col1",,ahk_id %hwWindow%
base := SubStr(A_Desktop,0,1)=="" ? SubStr(A_Desktop,1,-1) : A_Desktop
Loop, Parse, files,n,
r {
path := base "" A_LoopField
IfExist %path% ; ignore special icons like Computer (at least for now)
ret .= path "`n"
}
} else {
if selection
collection := window.document.SelectedItems
else
collection := window.document.Folder.Items
for item in collection
ret .= item.path "`n"
}
return Trim(ret,"`n")
}
通过上述方法,可以在API资源管理器中有效地选择和管理文件夹,从而满足不同的开发需求。
小伙伴们,上文介绍了“api资源管理器选择文件夹”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/694378.html