Лист свойств Windows Расширение оболочки с рабочим потоком

Я думаю о написании расширения оболочки Win32, которое добавляет страницу в диалоговое окно «Свойства» для дисков и папок. На этой странице будет отображаться информация, которую может получить дорого. Из-за этого я хотел бы поместить логику сбора данных в рабочий поток, чтобы не нарушать пользовательский интерфейс и отображать обратную связь для пользователя на рассматриваемой странице. Страница будет инициализирована и, таким образом, запустит процесс сбора данных, когда пользователь выберет страницу (вкладку) в диалоговом окне «Свойства». После прочтения соответствующей документации MSDN мне не ясно, как можно было бы интегрировать рабочий поток в страницу листа свойств для диалогового окна «Свойства, созданные оболочкой».

Обычно я бы использовал либо PostThreadMessage, чтобы отправить личное сообщение в цикл сообщений в потоке пользовательского интерфейса из рабочего потока, либо MsgWaitForMultipleObjects в потоке пользовательского интерфейса и сигнализировал о событии синхронизации из рабочего потока, чтобы указать, что единица работы была выполнена и механизм обратной связи пользовательского интерфейса (скажем, индикатор прогресса) должен быть обновлен. Тем не менее, они оба требуют интеграции в цикл обработки сообщений, который в случае диалогового окна свойств оболочки предопределен.

Я заметил, что когда я открываю стандартный диалог свойств из проводника Windows для папки, и он отображает количество подпапок и файлов в выбранной папке и из нее, кажется, что подсчет папок/файлов происходит в фоновом режиме потому что диалоговое окно все еще реагирует, поэтому я предполагаю, что то, что я хочу сделать, должно быть возможно?


person Matthew    schedule 19.05.2016    source источник
comment
Вы можете опубликовать сообщение на странице листа свойств.   -  person Raymond Chen    schedule 20.05.2016
comment
Публикация сообщения из одного потока в другой (в данном случае из фонового рабочего потока в основной передний план/поток пользовательского интерфейса) потребует использования PostThreadMessage, метода, который отправляет сообщения, не связанные с каким-либо окном. Документация MSDN в этом вопросе расплывчата, но, похоже, она не указывает на то, что существует какой-либо способ гарантировать, что нерелевантное или нестандартное сообщение, полученное циклом сообщений предопределенного диалога свойств оболочки, будет передано процедуре диалога. для страницы.   -  person Matthew    schedule 20.05.2016
comment
Однако с тех пор мне пришло в голову, что одним из возможных решений этой проблемы может быть использование перехватчика сообщений (т.е. SetWindowsHookEx( WH_GETMESSAGE, ... )). Я проверю это вместе с предложением @DenisAnisimov.   -  person Matthew    schedule 20.05.2016
comment
Вам не нужен крючок сообщений. Страница вашего листа свойств получит сообщение через обычный насос сообщений. Напоминаю вам, что у вас уже есть окно: Страница вашего листа свойств — это окно. Отправьте сообщение в это окно и обработайте его в своей диалоговой процедуре.   -  person Raymond Chen    schedule 20.05.2016


Ответы (1)


Я сделал то же самое. Рабочий поток создается с помощью SHCreateThread. В потоке пользовательского интерфейса я создаю таймер. В обработчике OnTimer я запрашиваю рабочий поток о состоянии выполнения и так далее. В зависимости от ответа я обновляю пользовательский интерфейс своего листа. Если пользователь закрывает диалоговое окно свойств до завершения расчета рабочего потока, я просто прошу рабочий поток остановиться. Когда цикл рабочего потока завершится, shell32.dll закроет поток сам по себе, поэтому мне не нужно ждать.

person Denis Anisimov    schedule 19.05.2016
comment
Раньше я не знал о SHCreateThread - обязательно проверю. Спасибо за совет. - person Matthew; 20.05.2016