【问题标题】:Showing a Windows Explorer Dialog from a C++ application从 C++ 应用程序显示 Windows 资源管理器对话框
【发布时间】:2015-01-21 06:49:16
【问题描述】:

我有一个用 C++ 编写的 Windows 应用程序。 应用程序在隐藏目录中生成某些配置文件。 我想为用户提供从我的应用程序中打开该目录的选项。 单击该选项应打开带有输入目录位置的 Windows 资源管理器之类的对话框。 我花时间搜索类似的 api,但最终会出现某些对话框,例如“DlgDirListComboBoxW”或“GetOpenFileName”或“GetSaveFileName”。 我正在寻找一个 api 来打开普通的 Windows 资源管理器,比如带有输入目录位置的对话框。 如果 api 属于 CommonDialogs 部分,那将非常有帮助。

【问题讨论】:

  • 启动一个explorer 实例,你现在
  • 你可以使用系统调用system("explorer c:\\users");
  • 是的...请不要使用system("explorer c:\\users");。事实上,请不要使用system。

标签: c++ explorer opendialog


【解决方案1】:

您可以使用SHBrowseForFolder

它显示一个类似这样的对话框:

这是一个如何使用它的示例:

BOOL GetFolder(LPCSTR folderpath, 
               LPCSTR szCaption, 
               HWND hOwner /*= NULL*/)
{
    BOOL retVal = FALSE;

    // The BROWSEINFO struct tells the shell 
    // how it should display the dialog.
    BROWSEINFO bi;
    memset(&bi, 0, sizeof(bi));

    bi.ulFlags   = BIF_USENEWUI;
    bi.hwndOwner = hOwner;
    bi.lpszTitle = szCaption;   

    // must call this if using BIF_USENEWUI
    ::OleInitialize(NULL);

    // Show the dialog and get the itemIDList for the 
    // selected folder.
    LPITEMIDLIST pIDL = ::SHBrowseForFolder(&bi);

    if(pIDL != NULL)
    {
        // Create a buffer to store the path, then 
        // get the path.
        char buffer[_MAX_PATH] = {'\0'};
        if(::SHGetPathFromIDList(pIDL, buffer) != 0)
        {
            // Set the string value.
            folderpath = buffer;
            retVal = TRUE;
        }

        // free the item id list
        CoTaskMemFree(pIDL);
    }

    ::OleUninitialize();

    return retVal;
}

【讨论】:

    【解决方案2】:

    怎么样:

    HWND hWndOwner = NULL;
    
    ShellExecute(
        hWndOwner,
        _T("explore"),
        _T("c:\\some\\path"),
        NULL,
        NULL,
        SW_SHOWNORMAL);
    

    如果您愿意,可以将hWndOwner 设置为您的主窗口句柄,并且可以从多种其他选项中进行选择。

    有关更多信息和使用详情,请查看 ShellExecute 上的 MSDN 页面。

    【讨论】:

    • 为您修复了explore 的错字。我认为修复_T 的东西是不对的,因为这是你的代码。但是向任何人,尤其是新手教授这一点是一件非常糟糕的事情。
    • @Cheersandhth.-Alf 这不是错字。正确的关键字是 explore(根据 MSDN 页面)。至于_T位:我不知道他的程序是MBCS还是UNICODE,因为ShellExecute有A和W两种,我必须使用“便携式”方式。如果您知道根据项目配置传递可能是 MBCS 或 UNICODE 的文字的更好方法,请务必告诉我。
    • 比使用_T(为支持Windows 9x 付出高昂代价)更好的方法是不使用_T。除了 1990 年代初期的遗留代码外,您始终可以假定为 UNICODE。 _T 支持 Windows 9x,它在 2000 年随着 Unicode 层的引入已经过时,即现在已经过时 15 年的肮脏的基于宏的技术,以支持 20 年的时代错误。
    • 很抱歉将动词误认为是可执行文件名。
    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2019-08-03
    • 2011-04-02
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多