【问题标题】:IFileOperation and the progress dialogIFileOperation 和进度对话框
【发布时间】:2011-06-01 23:36:07
【问题描述】:

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

问题是,在将文件复制到我的虚拟 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


【解决方案1】:

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

【讨论】:

  • 好主意,我一定会试一试。复制完成后出现Explorer的进度对话框,我还是怕解决不了……
  • 嗯……我现在只知道标准进度对话框是Dialog,并且有数十个实例。其中没有一个似乎有 Explorer 作为父母。有趣的是,将 Explorer 的窗口设置为我自己的对话框的所有者,使它成为进度对话框的模态,这是我想要的一部分。
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多