是否可以调用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