从命令行应用程序调用Windows公共对话框

时间:2010-11-16 17:59:29

标签: c++ windows user-interface command-line

是否可以调用Windows公共对话框并从命令行应用程序中检索其输出?我想构建我的大多数应用程序来从控制台运行,因为在我的特定情况下它会严重降低复杂性;但是,我希望能够弹出一个文件夹选择器对话框,让用户选择一个目录。我只想避免创建一个完整的GUI应用程序的开销。

我会在C ++中这样做,如果这有所不同。

3 个答案:

答案 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();
        }
    }
}

(摘自http://vcfaq.mvps.org/sdk/20.htm

答案 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)

只需使用通用DialogBoxParamDialogBoxIndirectParam即可创建对话框。

您必须编写适当的回调并处理用户输入。实际上,无论是从控制台应用程序创建窗口还是从winapi创建窗口都没有太大区别。

视觉术语的唯一区别在于第二个在默认情况下隐藏了它的控制台。

如果您愿意,您可以始终坚持使用QtwxWidgets之类的内容,如果它不是一种矫枉过正的话。