2015-01-21 80 views
0

我有用C++編寫的Windows應用程序。 應用程序在隱藏的目錄中生成某些配置文件。 我想給用戶一個選項來從我的應用程序中打開該目錄。 單擊該選項應打開一個Windows資源管理器,如帶輸入目錄位置的對話框。 我花時間搜索類似的api,但最終得到了諸如「DlgDirListComboBoxW」或「GetOpenFileName」或「GetSaveFileName」之類的特定對話框。 我正在尋找一個API來打開普通的Windows資源管理器,如帶有輸入目錄位置的對話框。 如果API屬於CommonDialogs部分,那將非常有用。顯示來自C++應用程序的Windows資源管理器對話框

+1

剛剛火起來的'explorer' instance,u now – 2015-01-21 06:50:49

+1

你可以使用系統調用作爲'system(「explorer c:\\ users」);' – Elvisjames 2015-01-21 07:06:20

+1

是啊...... *請求se *不要使用'system(「explorer c:\\ users」);'。事實上,*請*根本不使用'system'。 – 2015-01-21 09:05:36

回答

1

如何:

HWND hWndOwner = NULL; 

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

您可以設置hWndOwner到主窗口句柄,如果你願意,可以從其他各種選項中進行選擇。

有關更多信息和使用的詳細信息,請查看ShellExecute上的MSDN頁面。

+0

修復了您的「探索」錯字。我不認爲修復'_T'是不對的,因爲它是你的代碼。但要教給別人,特別是新手,這是一件非常糟糕的事情。 – 2015-01-21 07:20:55

+0

@ Cheersandhth.-Alf這不是一個錯字。正確的關鍵字是'explore'(根據MSDN頁面)。至於'_T'位:我不知道他的程序是MBCS還是UNICODE,而且由於'ShellExecute'有A和W兩種類型,所以我必須使用「便攜」方式。如果您知道通過一種更好的方式傳遞一個可能是MBCS或UNICODE的文字,具體取決於項目配置,請通過任何方式告訴我。 – 2015-01-21 09:03:08

+1

比使用'_T'(付出沉重代價支持WIndows 9x)更好的方法是不使用'_T'。除了1990年代早期的遺留代碼外,您始終可以使用UNICODE。 '_T'支持Windows 9x,並且在2000年推出了Layer for Unicode,即現在已有15年過時的基於宏的宏技術,以支持20年前的時代錯誤。 – 2015-01-21 10:26:33

0

可以使用SHBrowseForFolder

它顯示了一個類似的對話框:

enter image description here

這是如何使用它的一個例子:

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; 
} 
相關問題