2010-11-16 53 views
1

是否可以調用Windows公共對話框並從命令行應用程序中檢索其輸出?我想構建我的大部分應用程序以從控制檯運行,因爲在我的特殊情況下,它會嚴重降低複雜性;不過,我希望能夠彈出一個文件夾選擇器對話框讓用戶選擇一個目錄。我只想避免創建一個完整的GUI應用程序的開銷。從命令行應用程序調用Windows公共對話框

我會在C++中做這個,如果這樣做有所作爲。

+1

是的,你可以使用GUI工具包和仍然控制檯I/O。爲什麼不? – delnan 2010-11-16 18:04:26

+0

我知道,但我認爲這樣做會看起來更清潔,考慮到我需要GUI的唯一一件事是接受用戶的文件夾路徑。其他一切都將在控制檯上。 – Matthew 2010-11-16 20:57:18

回答

3
#include <windows.h> 
#include <shlobj.h> 
#include <iostream> 

int main() { 
    BROWSEINFO bi = {0}; 
    bi.lpszTitle = "Pick a Directory"; 
    LPITEMIDLIST pidl = SHBrowseForFolder (&bi); 
    if (pidl != 0) { 
     TCHAR path[MAX_PATH]; 
     if (SHGetPathFromIDList(pidl, path)) { 
      std::cout << path << "\n"; 
     } 

     IMalloc* imalloc = 0; 
     if (SUCCEEDED(SHGetMalloc(&imalloc))) { 
      imalloc->Free(pidl); 
      imalloc->Release(); 
     } 
    } 
} 

(從http://vcfaq.mvps.org/sdk/20.htm拍攝)

+0

這完全是我想要做的。謝謝! – Matthew 2010-11-16 20:56:03

+0

那麼你可能應該給它一個upvote ;-) – Milan 2010-11-16 21:43:46

+0

完成!對不起,我不知道我可以選擇它作爲答案,並upvote它。 ;) – Matthew 2010-11-18 22:24:01

1

只需使用通用的DialogBoxParamDialogBoxIndirectParam來創建對話框。您將不得不編寫適當的回調並處理用戶輸入。實際上,無論是從控制檯應用程序還是從類似於winapi的窗口創建窗口都沒有太大的區別。

視覺術語的唯一區別是第二個隱藏它的控制檯默認情況下。

如果你願意,你可以堅持像QtwxWidgets,如果它不是過度殺傷。

+0

感謝您的提示......我可以看到,如果我想創建自己的對話框資源並從命令行調用它們,這將會特別有用。 – Matthew 2010-11-16 21:21:47

2

由Windows SDK提供的通用對話框可以從一個控制檯應用程序調用。你只需要檢查他們的個人要求。有些需要COM單線程單元(STA)。

顯示對話框時,您可以將所有者窗口設置爲nullptr。或者,如果您希望對話框相對於控制檯窗口是模態的,則可以使用GetConsoleWindow函數獲取控制檯使用的窗口句柄。然後,您可以將該窗口句柄作爲其所有者傳遞給該對話框。

下面是一個使用GetConsoleWindow與標準的任務對話框使用的例子:

int main() 
{ 
    TaskDialog(GetConsoleWindow(), 
       nullptr, // module 
       L"Title", 
       L"Instruction", 
       L"Content", 
       TDCBF_OK_BUTTON, 
       TD_INFORMATION_ICON, 
       nullptr); // button 
} 
+0

我不知道GetConsoleWindow()函數......這很有用。儘管如此,我還是必須先定義預處理器變量_WIN32_WINNT = 0x0500。 – Matthew 2010-11-16 21:31:39

+0

哪個需要COM STA?他們很老,他們甚至早於COM和線程。 – MSalters 2010-11-17 10:04:00

+0

shell提供的很多較新的對話框需要COM,尤其是那些在Windows Vista中引入的替代舊對話框的對話框。例如看一下IFileDialog。 – 2010-11-17 14:31:13