IFileOperation и диалог прогресса - PullRequest
2 голосов
/ 02 июня 2011

Итак, я работаю над расширением пространства имен оболочки, которое обрабатывает своего рода ZIP-файл (назовем его ZOP) как папку.Все на месте, и файловые операции обрабатываются с помощью IFileOperation и IStream.

Дело в том, что при копировании файла в мою виртуальную папку ZOP вызов IStream::Commit не является тривиальным и может занятьзначительное время, поэтому я хотел бы предоставить дополнительную обратную связь пользователю (и позволить ей отменить операцию).

У меня уже есть механизм обратного вызова прогресса, который запускается, когда поток фиксируется.На данный момент я создал собственный диалог, включающий индикатор выполнения, который появляется при каждом вызове IStream::Commit.

Однако я не могу найти hWnd стандартного прогрессадиалог, так что мой может быть модальным (что означает, что мой диалог может быть скрыт самим диалогом прогресса, что противоречит цели моего диалога).

Я мог бы пойти по пути IFileOperation::SetProgressDialog, создав мост кIOperationsProgressDialog, но мне все равно придется сделать какой-нибудь грязный код, чтобы найти индикатор выполнения в потоке, который я не создал - все, что я могу придумать для передачи данных, - это TLS, и, боже, я ненавижу это решение,сродни использованию глобальной переменной.

Мысли о получении дескриптора окна или создании подкласса стандартного диалога?


Примечание: I 'Мы заметили, что иногда для относительно коротких операций стандартный диалог появляется после очистки потока.Это тоже не круто, так как мой пользовательский диалог появляется и исчезает даже до того, как кажется, что операции начинаются.


Обновление : я обнаружил прогрессОкно с использованием EnumWindows / FindWindowEx в качестве окна имеет класс Dialog с дочерним элементом DirectUIHWND.Самое смешное, что при создании экземпляра моего диалога с помощью DialogBoxParam () (в отдельном потоке от IStream :: Commit ()) вызов зависает даже до отображения моего диалога, так как он застревает в NtUserCallHwndParamLock.

1 Ответ

1 голос
/ 02 июня 2011

Похоже на работу для spy ++, найдите имя класса окна, которое ищет вас, и вызовите FindWinow или FindWindowEx.

...