是否可以调用Windows公共对话框并从命令行应用程序中检索其输出?我想构建我的大多数应用程序来从控制台运行,因为在我的特定情况下它会严重降低复杂性;但是,我希望能够弹出一个文件夹选择器对话框,让用户选择一个目录。我只想避免创建一个完整的GUI应用程序的开销。
我会在C ++中这样做,如果这有所不同。
答案 0 :(得分: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();
}
}
}
答案 1 :(得分: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
}
答案 2 :(得分:1)
只需使用通用DialogBoxParam
或DialogBoxIndirectParam
即可创建对话框。
您必须编写适当的回调并处理用户输入。实际上,无论是从控制台应用程序创建窗口还是从winapi
创建窗口都没有太大区别。
视觉术语的唯一区别在于第二个在默认情况下隐藏了它的控制台。
如果您愿意,您可以始终坚持使用Qt
或wxWidgets
之类的内容,如果它不是一种矫枉过正的话。