IFileOperation和进度对话框

时间:2011-06-01 23:36:08

标签: c++ windows-7 modal-dialog progressdialog windows-explorer

所以,我正在研究这个shell命名空间扩展,它处理一种ZIP文件(让我们称之为ZOP)就像一个文件夹。 一切就绪,文件操作通过IFileOperationIStream进行处理。

问题是,在将文件复制到我的虚拟ZOP文件夹时,调用IStream::Commit并不简单,并且可能需要很长时间,因此我想向用户提供其他反馈(并允许她取消操作)。

我已经有一个进度回调机制,在提交流时启动。我现在所做的是一个自定义对话框,包括一个进度条,只要调用IStream::Commit就会弹出。

然而,我似乎无法找到标准进度对话框的hWnd,因此我的可以是模态的(这意味着我的对话框可以被进度对话框本身隐藏,这违背了我的目的对话框)。

我可以采用IFileOperation::SetProgressDialog方式,创建一个IOperationsProgressDialog的桥梁,但我仍然需要做一些脏代码才能从我没有创建的流中找到进度条 - 所有我可以想到传递数据是TLS,而男孩我讨厌这个解决方案,类似于使用全局变量。

关于检索窗口句柄或继承标准对话框的想法?


注意: 我观察到,有时候,对于相对较短的操作,在刷新流后会出现标准对话框。这也是不酷的,因为我的自定义对话框出现了,甚至在操作似乎开始之前就消失了。


更新 :我找到了使用EnumWindows / FindWindowEx的进度窗口,因为窗口中的Dialog类带有DirectUIHWND子级。有趣的是,当使用DialogBoxParam()(在IStream :: Commit()的一个独特线程中)实例化我的对话框时,调用在我的对话框显示之前就会挂起,因为它会卡在NtUserCallHwndParamLock中。 / p>

1 个答案:

答案 0 :(得分:1)

听起来像间谍++的工作,得到你正在寻找的窗口的类名,并调用FindWinow或FindWindowEx。