所以,我正在研究这个shell命名空间扩展,它处理一种ZIP文件(让我们称之为ZOP)就像一个文件夹。
一切就绪,文件操作通过IFileOperation
和IStream
进行处理。
问题是,在将文件复制到我的虚拟ZOP文件夹时,调用IStream::Commit
并不简单,并且可能需要很长时间,因此我想向用户提供其他反馈(并允许她取消操作)。
我已经有一个进度回调机制,在提交流时启动。我现在所做的是一个自定义对话框,包括一个进度条,只要调用IStream::Commit
就会弹出。
然而,我似乎无法找到标准进度对话框的hWnd
,因此我的可以是模态的(这意味着我的对话框可以被进度对话框本身隐藏,这违背了我的目的对话框)。
我可以采用IFileOperation::SetProgressDialog
方式,创建一个IOperationsProgressDialog
的桥梁,但我仍然需要做一些脏代码才能从我没有创建的流中找到进度条 - 所有我可以想到传递数据是TLS,而男孩我讨厌这个解决方案,类似于使用全局变量。
关于检索窗口句柄或继承标准对话框的想法?
注意: 我观察到,有时候,对于相对较短的操作,在刷新流后会出现标准对话框。这也是不酷的,因为我的自定义对话框出现了,甚至在操作似乎开始之前就消失了。
更新 :我找到了使用EnumWindows / FindWindowEx的进度窗口,因为窗口中的Dialog
类带有DirectUIHWND
子级。有趣的是,当使用DialogBoxParam()(在IStream :: Commit()的一个独特线程中)实例化我的对话框时,调用在我的对话框显示之前就会挂起,因为它会卡在NtUserCallHwndParamLock
中。 / p>
答案 0 :(得分:1)
听起来像间谍++的工作,得到你正在寻找的窗口的类名,并调用FindWinow或FindWindowEx。