从命令行应用程序调用 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】:只需使用通用的DialogBoxParam
或DialogBoxIndirectParam
来创建您的对话框。
您必须编写适当的回调并处理用户输入。实际上,无论您是从控制台应用程序还是从winapi
-like 创建窗口,都没有太大区别。
视觉上唯一的区别是第二个默认隐藏了它的控制台。
如果您愿意,您可以始终坚持使用 Qt
或 wxWidgets
之类的东西,如果这不是矫枉过正的话。
【讨论】:
感谢您的提示...如果我想创建自己的对话框资源并从命令行调用它们,我可以看到这将特别有用。以上是关于从命令行应用程序调用 Windows 通用对话框的主要内容,如果未能解决你的问题,请参考以下文章
如何将任意命令行参数从 MinGW shell 传递给本机 Windows 程序?
如何让Node命令行程序直接在Windows CMD中输入命令执行
如何从 C++ 后台任务(Windows 通用应用程序)调用 C# 函数?
为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?