如何通过API资源管理器选择文件夹?

在API资源管理器中选择文件夹是一项常见的任务,特别是在需要浏览文件系统、打开项目文件夹或保存数据时,以下是关于如何在API资源管理器中选择文件夹的详细步骤:

api资源管理器选择文件夹

1、使用Windows 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;
    }
}

2、使用Shell.Application对象

获取当前资源管理器窗口:可以通过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资源管理器选择文件夹

小伙伴们,上文介绍了“api资源管理器选择文件夹”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/694378.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seoK-seo
Previous 2024-12-01 13:35
Next 2024-12-01 13:36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入