Я думаю о написании расширения оболочки Win32, которое добавляет страницу в диалоговое окно «Свойства» для дисков и папок. На этой странице будет отображаться информация, которую может получить дорого. Из-за этого я хотел бы поместить логику сбора данных в рабочий поток, чтобы не нарушать пользовательский интерфейс и отображать обратную связь для пользователя на рассматриваемой странице. Страница будет инициализирована и, таким образом, запустит процесс сбора данных, когда пользователь выберет страницу (вкладку) в диалоговом окне «Свойства». После прочтения соответствующей документации MSDN мне не ясно, как можно было бы интегрировать рабочий поток в страницу листа свойств для диалогового окна «Свойства, созданные оболочкой».
Обычно я бы использовал либо PostThreadMessage
, чтобы отправить личное сообщение в цикл сообщений в потоке пользовательского интерфейса из рабочего потока, либо MsgWaitForMultipleObjects
в потоке пользовательского интерфейса и сигнализировал о событии синхронизации из рабочего потока, чтобы указать, что единица работы была выполнена и механизм обратной связи пользовательского интерфейса (скажем, индикатор прогресса) должен быть обновлен. Тем не менее, они оба требуют интеграции в цикл обработки сообщений, который в случае диалогового окна свойств оболочки предопределен.
Я заметил, что когда я открываю стандартный диалог свойств из проводника Windows для папки, и он отображает количество подпапок и файлов в выбранной папке и из нее, кажется, что подсчет папок/файлов происходит в фоновом режиме потому что диалоговое окно все еще реагирует, поэтому я предполагаю, что то, что я хочу сделать, должно быть возможно?
PostThreadMessage
, метода, который отправляет сообщения, не связанные с каким-либо окном. Документация MSDN в этом вопросе расплывчата, но, похоже, она не указывает на то, что существует какой-либо способ гарантировать, что нерелевантное или нестандартное сообщение, полученное циклом сообщений предопределенного диалога свойств оболочки, будет передано процедуре диалога. для страницы. - person Matthew   schedule 20.05.2016SetWindowsHookEx( WH_GETMESSAGE, ... )
). Я проверю это вместе с предложением @DenisAnisimov. - person Matthew   schedule 20.05.2016