是否可以調用Windows公共對話框並從命令行應用程序中檢索其輸出?我想構建我的大部分應用程序以從控制檯運行,因爲在我的特殊情況下,它會嚴重降低複雜性;不過,我希望能夠彈出一個文件夾選擇器對話框讓用戶選擇一個目錄。我只想避免創建一個完整的GUI應用程序的開銷。從命令行應用程序調用Windows公共對話框
我會在C++中做這個,如果這樣做有所作爲。
是否可以調用Windows公共對話框並從命令行應用程序中檢索其輸出?我想構建我的大部分應用程序以從控制檯運行,因爲在我的特殊情況下,它會嚴重降低複雜性;不過,我希望能夠彈出一個文件夾選擇器對話框讓用戶選擇一個目錄。我只想避免創建一個完整的GUI應用程序的開銷。從命令行應用程序調用Windows公共對話框
我會在C++中做這個,如果這樣做有所作爲。
#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();
}
}
}
只需使用通用的DialogBoxParam
或DialogBoxIndirectParam
來創建對話框。您將不得不編寫適當的回調並處理用戶輸入。實際上,無論是從控制檯應用程序還是從類似於winapi
的窗口創建窗口都沒有太大的區別。
視覺術語的唯一區別是第二個隱藏它的控制檯默認情況下。
如果你願意,你可以堅持像Qt
或wxWidgets
,如果它不是過度殺傷。
感謝您的提示......我可以看到,如果我想創建自己的對話框資源並從命令行調用它們,這將會特別有用。 – Matthew 2010-11-16 21:21:47
由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
}
是的,你可以使用GUI工具包和仍然控制檯I/O。爲什麼不? – delnan 2010-11-16 18:04:26
我知道,但我認爲這樣做會看起來更清潔,考慮到我需要GUI的唯一一件事是接受用戶的文件夾路徑。其他一切都將在控制檯上。 – Matthew 2010-11-16 20:57:18