Проблема такая:
ловлю диалог по WH_CBT, HCBT_ACTIVATE.
как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам.
но они в это время оказываются еще не досозданы. (это я вижу из SPY++)
подскажите, как дождаться конца достройки?
не таймаут же какой-нить ставить?!
ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.
WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!"
Здравствуйте niksap, Вы писали:
N>Проблема такая: N>ловлю диалог по WH_CBT, HCBT_ACTIVATE. N>как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам. N>но они в это время оказываются еще не досозданы. (это я вижу из SPY++)
N>подскажите, как дождаться конца достройки? N>не таймаут же какой-нить ставить?! N>ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.
N>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!"
Я бы попробовал послать диалогу холостое сообщение (что-то типа WM_NULL) синхронно (с помощью SendMessage). Если обработал, значит всё, со своими сообщениями разобрался. Но это только предположение.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Здравствуйте niksap, Вы писали:
N>Проблема такая: N>ловлю диалог по WH_CBT, HCBT_ACTIVATE. N>как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам. N>но они в это время оказываются еще не досозданы. (это я вижу из SPY++)
N>подскажите, как дождаться конца достройки? N>не таймаут же какой-нить ставить?! N>ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.
N>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!"
А WH_FOREGROUNDIDLE не помогает?
N>помогите, плз.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Alexander Shargin, Вы писали:
AS>Здравствуйте niksap, Вы писали:
N>>Проблема такая: N>>ловлю диалог по WH_CBT, HCBT_ACTIVATE. N>>как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам. N>>но они в это время оказываются еще не досозданы. (это я вижу из SPY++)
N>>подскажите, как дождаться конца достройки? N>>не таймаут же какой-нить ставить?! N>>ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.
N>>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!"
AS>Я бы попробовал послать диалогу холостое сообщение (что-то типа WM_NULL) синхронно (с помощью SendMessage). Если обработал, значит всё, со своими сообщениями разобрался. Но это только предположение.
уже пробовал, именно SendMessage( hwnd, WM_NULL, 0, 0). Все равно не срабатывает.
Здравствуйте Alexander Shargin, Вы писали:
AS>Здравствуйте niksap, Вы писали:
N>>Проблема такая: N>>ловлю диалог по WH_CBT, HCBT_ACTIVATE. N>>как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам. N>>но они в это время оказываются еще не досозданы. (это я вижу из SPY++)
N>>подскажите, как дождаться конца достройки? N>>не таймаут же какой-нить ставить?! N>>ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.
N>>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!"
AS>Я бы попробовал послать диалогу холостое сообщение (что-то типа WM_NULL) синхронно (с помощью SendMessage). Если обработал, значит всё, со своими сообщениями разобрался. Но это только предположение.
уже пробовал, именно SendMessage( hwnd, WM_NULL, 0, 0). Все равно не срабатывает.
Здравствуйте Sergey, Вы писали:
S>Здравствуйте niksap, Вы писали:
N>>Проблема такая: N>>ловлю диалог по WH_CBT, HCBT_ACTIVATE. N>>как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам. N>>но они в это время оказываются еще не досозданы. (это я вижу из SPY++)
N>>подскажите, как дождаться конца достройки? N>>не таймаут же какой-нить ставить?! N>>ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.
N>>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!" S> А WH_FOREGROUNDIDLE не помогает?
это не одно и тоже? как я понял WaitForInputIdle ((HANDLE)hProcess, INFINITE) срабатывает, когда hProcess как раз становиться в Idle т.е. ждет ввода. WH_FOREGROUNDIDLE будет привязян к потоку/процессу, а мне, скорее, надо к окну.
Или я чего не понимаю?
Здравствуйте niksap, Вы писали:
N>Здравствуйте Sergey, Вы писали:
S>>Здравствуйте niksap, Вы писали:
N>>>Проблема такая: N>>>ловлю диалог по WH_CBT, HCBT_ACTIVATE. N>>>как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам. N>>>но они в это время оказываются еще не досозданы. (это я вижу из SPY++)
N>>>подскажите, как дождаться конца достройки? N>>>не таймаут же какой-нить ставить?! N>>>ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.
N>>>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!" S>> А WH_FOREGROUNDIDLE не помогает?
N>это не одно и тоже? как я понял WaitForInputIdle ((HANDLE)hProcess, INFINITE) срабатывает, когда hProcess как раз становиться в Idle т.е. ждет ввода. WH_FOREGROUNDIDLE будет привязян к потоку/процессу, а мне, скорее, надо к окну. N>Или я чего не понимаю?
Разница в том, что WaitForInputIdle — для процесса (его primary потока), а WH_FOREGROUNDIDLE — для любого потока. Если диалог создается не в основном потоке, может помочь.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
N>>>>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!" S>>> А WH_FOREGROUNDIDLE не помогает?
N>>это не одно и тоже? как я понял WaitForInputIdle ((HANDLE)hProcess, INFINITE) срабатывает, когда hProcess как раз становиться в Idle т.е. ждет ввода. WH_FOREGROUNDIDLE будет привязян к потоку/процессу, а мне, скорее, надо к окну. N>>Или я чего не понимаю? S> Разница в том, что WaitForInputIdle — для процесса (его primary потока), а WH_FOREGROUNDIDLE — для любого потока. Если диалог создается не в основном потоке, может помочь.
Начнем с того, что WaitForInputIdle работает со всеми потоками процесса, а не только с главным.
А WH_FOREGROUNDIDLE срабатывает когда "a hook procedure that will be called when the application's foreground thread is about to become idle", т.е. когда активное окно потока выходит на idle.
Здравствуйте TSS, Вы писали:
TSS>Здравствуйте Sergey, Вы писали:
N>>>>>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!" S>>>> А WH_FOREGROUNDIDLE не помогает?
N>>>это не одно и тоже? как я понял WaitForInputIdle ((HANDLE)hProcess, INFINITE) срабатывает, когда hProcess как раз становиться в Idle т.е. ждет ввода. WH_FOREGROUNDIDLE будет привязян к потоку/процессу, а мне, скорее, надо к окну. N>>>Или я чего не понимаю? S>> Разница в том, что WaitForInputIdle — для процесса (его primary потока), а WH_FOREGROUNDIDLE — для любого потока. Если диалог создается не в основном потоке, может помочь.
TSS>Начнем с того, что WaitForInputIdle работает со всеми потоками процесса, а не только с главным.
Откуда сведения? Если главный поток создал дочерний со своей очередью сообщений, то чего будет ждать WaitForInputIdle — когда обе очереди пустые или любая из них пустая? TSS>А WH_FOREGROUNDIDLE срабатывает когда "a hook procedure that will be called when the application's foreground thread is about to become idle", т.е. когда активное окно потока выходит на idle.
Что-то я не заметил слова "окно" в английмком тексте .
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
TSS>>Начнем с того, что WaitForInputIdle работает со всеми потоками процесса, а не только с главным. S> Откуда сведения? Если главный поток создал дочерний со своей очередью сообщений, то чего будет ждать WaitForInputIdle — когда обе очереди пустые или любая из них пустая?
Чистейший здравый смысл, да и где-то в KB статья была, только, к сожалению, я её с ходу не нашел.
Идея такова. Как известно, очередь сообщений, как таковая, для каждого потока своя и она одна. Если в WaitForInputIdle() не передаеться HANDLE потока, значит мы не определяем, какую из очередей потоков процесса мы хотим пользовать.
TSS>>А WH_FOREGROUNDIDLE срабатывает когда "a hook procedure that will be called when the application's foreground thread is about to become idle", т.е. когда активное окно потока выходит на idle. S> Что-то я не заметил слова "окно" в английмком тексте .
Поймал... Обычнох для окна. А так -- не обязательно. Этот хук вообще касаеться очереди сообщений.
Кста, сработает он в любом случае, только для активного потока, а не любого.
Здравствуйте TSS, Вы писали:
TSS>Здравствуйте Sergey, Вы писали:
TSS>>>Начнем с того, что WaitForInputIdle работает со всеми потоками процесса, а не только с главным. S>> Откуда сведения? Если главный поток создал дочерний со своей очередью сообщений, то чего будет ждать WaitForInputIdle — когда обе очереди пустые или любая из них пустая?
TSS>Чистейший здравый смысл, да и где-то в KB статья была, только, к сожалению, я её с ходу не нашел.
В KB WaitForInputIdle встречается ровно 3 раза, так что явно не там. А здравый смысл у всех разный, мне, например, он подсказывает, что WaitForInputIdle будет ждать опустошения очереди сообщений главного потока. TSS>Идея такова. Как известно, очередь сообщений, как таковая, для каждого потока своя и она одна. Если в WaitForInputIdle() не передаеться HANDLE потока, значит мы не определяем, какую из очередей потоков процесса мы хотим пользовать.
Угу. И используем главный. Иначе не понятно, чего именно ей надо ждать — смотри мой вопрос в предыдущем сообщении.
TSS>>>А WH_FOREGROUNDIDLE срабатывает когда "a hook procedure that will be called when the application's foreground thread is about to become idle", т.е. когда активное окно потока выходит на idle. S>> Что-то я не заметил слова "окно" в английмком тексте .
TSS>Поймал... TSS>Обычнох для окна. А так -- не обязательно. Этот хук вообще касаеться очереди сообщений.
TSS>Кста, сработает он в любом случае, только для активного потока, а не любого.
Угу. Под любым я имел в виду "какой скажешь" — само собой, если он станет foreground.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Можно по WM_ACTIVATE, послать родителю сообщение о готовности. Можно поставить будильник на пару милисекунд. А WaitForInputIdle хороша при запуске другого процесса, а тут, как я понял, это тот же процесс.
Здравствуйте ua1zcl, Вы писали:
U>Здравствуйте Sergey, Вы писали:
U>Можно по WM_ACTIVATE, послать родителю сообщение о готовности. Можно поставить будильник на пару милисекунд. А WaitForInputIdle хороша при запуске другого процесса, а тут, как я понял, это тот же процесс.
Родитель знать обо мне не знает и не обработает он меня.
Будильник и Sleep не получатся, так как поток то — тот же самый, т.к. тут происходит внедрение DLL с помощью ловушки. Получается, мне либо искуссвтенно еще один поток создавать, либо отказываться WM_ACTIVATE либо еще чего.
Извините,я не врубился вовремя. A по HCBT_MOVESIZE нельзя? Написано
HCBT_MOVESIZE — A window is about to be moved or sized. Что под этим скрывается?
Известно, что окно даже при повторной активации получает серию из WM_SIZE, и прочего. Надо попробовать. Вот другое решение. Вы получаете HCBT_CREATEWND, включайте SetTimer(0,0,10,TimerProc), у пусть делает Create Wnd. Я подобным образом делал, когда надо было моей прицепленной к процессу длл (другим, более грубым способом) получить сигнал о начале действий. Если неизвестно, когда там нужное окно оживёт, — дело осложняется. Не выключайте таймер, вызывайте EnumThreadWindows() и ищите нужное окно.
Александр
Re[2]: Ожидание создания диалога
От:
Аноним
Дата:
17.01.02 04:41
Оценка:
Здравствуйте ua1zcl, Вы писали:
U>Извините,я не врубился вовремя. A по HCBT_MOVESIZE нельзя? Написано U>HCBT_MOVESIZE — A window is about to be moved or sized. Что под этим скрывается? U> Известно, что окно даже при повторной активации получает серию из WM_SIZE, и прочего. Надо попробовать. Вот другое решение. Вы получаете HCBT_CREATEWND, включайте SetTimer(0,0,10,TimerProc), у пусть делает Create Wnd. Я подобным образом делал, когда надо было моей прицепленной к процессу длл (другим, более грубым способом) получить сигнал о начале действий. Если неизвестно, когда там нужное окно оживёт, — дело осложняется. Не выключайте таймер, вызывайте EnumThreadWindows() и ищите нужное окно.
Большое спасибо, это уже гораздо полезней. Честно говоря после HCBT_ACTIVATE я пропустил все остальные HCBT_XXX как не подходящие, так как они все "is about" (собирается), т.е. собирпредупреждают о готовящемся ...
Сейчас проверил — HCBT_MOVESIZE может подойти после соответсвующей обработки.
Остальное посмотрю по-позже.