Итак, я работаю над расширением пространства имен оболочки, которое обрабатывает своего рода ZIP-файл (назовем его ZOP) как папку.Все на месте, и файловые операции обрабатываются с помощью IFileOperation
и IStream
.
Дело в том, что при копировании файла в мою виртуальную папку ZOP вызов IStream::Commit
не является тривиальным и может занятьзначительное время, поэтому я хотел бы предоставить дополнительную обратную связь пользователю (и позволить ей отменить операцию).
У меня уже есть механизм обратного вызова прогресса, который запускается, когда поток фиксируется.На данный момент я создал собственный диалог, включающий индикатор выполнения, который появляется при каждом вызове IStream::Commit
.
Однако я не могу найти hWnd
стандартного прогрессадиалог, так что мой может быть модальным (что означает, что мой диалог может быть скрыт самим диалогом прогресса, что противоречит цели моего диалога).
Я мог бы пойти по пути IFileOperation::SetProgressDialog
, создав мост кIOperationsProgressDialog
, но мне все равно придется сделать какой-нибудь грязный код, чтобы найти индикатор выполнения в потоке, который я не создал - все, что я могу придумать для передачи данных, - это TLS, и, боже, я ненавижу это решение,сродни использованию глобальной переменной.
Мысли о получении дескриптора окна или создании подкласса стандартного диалога?
Примечание: I 'Мы заметили, что иногда для относительно коротких операций стандартный диалог появляется после очистки потока.Это тоже не круто, так как мой пользовательский диалог появляется и исчезает даже до того, как кажется, что операции начинаются.
Обновление : я обнаружил прогрессОкно с использованием EnumWindows / FindWindowEx в качестве окна имеет класс Dialog
с дочерним элементом DirectUIHWND
.Самое смешное, что при создании экземпляра моего диалога с помощью DialogBoxParam () (в отдельном потоке от IStream :: Commit ()) вызов зависает даже до отображения моего диалога, так как он застревает в NtUserCallHwndParamLock
.