2010-11-16 51 views
1

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

我会在C++中做这个,如果这样做有所作为。

+1

是的,你可以使用GUI工具包和仍然控制台I/O。为什么不? – delnan 2010-11-16 18:04:26

+0

我知道,但我认为这样做会看起来更清洁,考虑到我需要GUI的唯一一件事是接受用户的文件夹路径。其他一切都将在控制台上。 – Matthew 2010-11-16 20:57:18

回答

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拍摄)

+0

这完全是我想要做的。谢谢! – Matthew 2010-11-16 20:56:03

+0

那么你可能应该给它一个upvote ;-) – Milan 2010-11-16 21:43:46

+0

完成!对不起,我不知道我可以选择它作为答案,并upvote它。 ;) – Matthew 2010-11-18 22:24:01

1

只需使用通用的DialogBoxParamDialogBoxIndirectParam来创建对话框。您将不得不编写适当的回调并处理用户输入。实际上,无论是从控制台应用程序还是从类似于winapi的窗口创建窗口都没有太大的区别。

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

如果你愿意,你可以坚持像QtwxWidgets,如果它不是过度杀伤。

+0

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

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 
} 
+0

我不知道GetConsoleWindow()函数......这很有用。尽管如此,我还是必须先定义预处理器变量_WIN32_WINNT = 0x0500。 – Matthew 2010-11-16 21:31:39

+0

哪个需要COM STA?他们很老,他们甚至早于COM和线程。 – MSalters 2010-11-17 10:04:00

+0

shell提供的很多较新的对话框需要COM,尤其是那些在Windows Vista中引入的替代旧对话框的对话框。例如看一下IFileDialog。 – 2010-11-17 14:31:13