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

Posted

技术标签:

【中文标题】从命令行应用程序调用 Windows 通用对话框【英文标题】:Calling a windows common dialog from a command line application 【发布时间】:2010-11-16 17:59:28 【问题描述】:

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

我会在 C++ 中执行此操作,如果这有影响的话。

【问题讨论】:

是的,您可以使用 GUI 工具包并仍然执行控制台 I/O。为什么不呢? 我知道,但考虑到我需要 GUI 的唯一目的是接受用户的文件夹路径,我认为这样做会看起来更干净。其他一切都将在控制台上。 【参考方案1】:
#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)

【讨论】:

这正是我想做的。谢谢! 完成!抱歉,我不知道我可以选择它作为答案并投票。 ;)【参考方案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

【讨论】:

我不知道 GetConsoleWindow() 函数……这很有用。不过,我确实必须先定义预处理器变量 _WIN32_WINNT=0x0500 才能工作。 哪个需要 COM STA?它们太老了,甚至早于 COM 和线程。 shell 提供的许多较新的对话框都需要 COM,尤其是那些随 Windows Vista 引入的用于替换旧对话框的对话框。以 IFileDialog 为例。【参考方案3】:

只需使用通用的DialogBoxParamDialogBoxIndirectParam 来创建您的对话框。

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

视觉上唯一的区别是第二个默认隐藏了它的控制台。

如果您愿意,您可以始终坚持使用 QtwxWidgets 之类的东西,如果这不是矫枉过正的话。

【讨论】:

感谢您的提示...如果我想创建自己的对话框资源并从命令行调用它们,我可以看到这将特别有用。

以上是关于从命令行应用程序调用 Windows 通用对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何将任意命令行参数从 MinGW shell 传递给本机 Windows 程序?

如何让Node命令行程序直接在Windows CMD中输入命令执行

如何从 C++ 后台任务(Windows 通用应用程序)调用 C# 函数?

Windows 下有好用的命令行shell吗

为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?

Xshell实现Windows上传文件到Linux主机