gpt4 book ai didi

c++ - IFileOperation 和进度对话框

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:59 30 4
gpt4 key购买 nike

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

问题是,当将文件复制到我的虚拟 ZOP 文件夹中时,调用 IStream::Commit 并非易事,并且可能会花费大量时间,因此我想向用户(并允许她取消操作)。

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

但是,我似乎无法找到标准进度对话框的 hWnd 以便我的可以是模态的(这意味着我的对话框可以被进度对话框本身隐藏,这破坏了我对话的目的)。

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

关于检索窗口句柄或子类化标准对话框的想法?


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


更新:我使用 EnumWindows/FindWindowEx 找到了进度窗口,因为该窗口具有带有 DirectUIHWND 的 Dialog child 。有趣的是,当使用 DialogBoxParam()(在与 IStream::Commit() 不同的线程中)实例化我的对话框时,调用甚至在我的对话框显示之前就挂起,因为它卡在 NtUserCallHwndParamLock.

最佳答案

听起来像是 spy++ 的工作,获取正在查找的窗口的类名并调用 FindWinow 或 FindWindowEx。

关于c++ - IFileOperation 和进度对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6208931/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com