【发布时间】:2011-06-01 23:36:07
【问题描述】:
所以,我正在研究这个 shell 命名空间扩展,它处理一种 ZIP 文件(我们称之为 ZOP),就像一个文件夹。
一切就绪,文件操作通过IFileOperation和IStream处理。
问题是,在将文件复制到我的虚拟 ZOP 文件夹时,调用 IStream::Commit 并非易事,而且可能需要很长时间,所以我想向用户提供额外的反馈(并允许她取消操作)。
我已经有一个进度回调机制,在提交流时启动。我现在所做的是一个自定义对话框,包括一个进度条,每当调用IStream::Commit 时都会弹出。
但是,我似乎找不到标准进度对话框的hWnd,因此我的可以是模态的(这意味着我的对话框可以被进度对话框本身隐藏,这违背了我的对话框的目的) .
我可以采用IFileOperation::SetProgressDialog 的方式,创建一个到IOperationsProgressDialog 的桥梁,但是我仍然需要做一些脏代码才能从我没有创建的流中找到进度条——我能想到的传递数据是 TLS,我讨厌这种解决方案,类似于使用全局变量。
关于检索窗口句柄或子类化标准对话框的想法?
注意:我观察到,有时,对于相对较短的操作,标准对话框会在流刷新后出现。这也很不酷,因为我的自定义对话框甚至在操作似乎开始之前就出现并消失了。
更新:我使用 EnumWindows/FindWindowEx 找到了进度窗口,因为该窗口具有 Dialog 类和 DirectUIHWND 子级。有趣的是,当使用 DialogBoxParam()(在与 IStream::Commit() 不同的线程中)实例化我的对话框时,调用甚至在我的对话框显示之前就挂起,因为它卡在 NtUserCallHwndParamLock 中。
【问题讨论】:
-
"这意味着我的对话框可以被其他东西隐藏" Your dialog can always be hidden by something else.
-
@Billy:哦,不,我不是说“我想成为最顶尖的” :) 我只是希望我的对话框与 Explorer 的对话框是模态的——我们在同一个过程。我会解决这个问题。
标签: c++ windows-7 modal-dialog progressdialog windows-explorer