Ожидание создания диалога
От: niksap Россия  
Дата: 10.01.02 15:12
Оценка:
Проблема такая:
ловлю диалог по WH_CBT, HCBT_ACTIVATE.
как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам.
но они в это время оказываются еще не досозданы. (это я вижу из SPY++)

подскажите, как дождаться конца достройки?
не таймаут же какой-нить ставить?!
ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.

WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!"

помогите, плз.
Best regards, Nik
Re: Ожидание создания диалога
От: Alexander Shargin Россия RSDN.ru
Дата: 10.01.02 15:22
Оценка:
Здравствуйте niksap, Вы писали:

N>Проблема такая:

N>ловлю диалог по WH_CBT, HCBT_ACTIVATE.
N>как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам.
N>но они в это время оказываются еще не досозданы. (это я вижу из SPY++)

N>подскажите, как дождаться конца достройки?

N>не таймаут же какой-нить ставить?!
N>ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.

N>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!"


Я бы попробовал послать диалогу холостое сообщение (что-то типа WM_NULL) синхронно (с помощью SendMessage). Если обработал, значит всё, со своими сообщениями разобрался. Но это только предположение.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re: Ожидание создания диалога
От: Sergey Россия  
Дата: 10.01.02 16:55
Оценка:
Здравствуйте niksap, Вы писали:

N>Проблема такая:

N>ловлю диалог по WH_CBT, HCBT_ACTIVATE.
N>как поймал HCBT_ACTIVATE сразу лезу по его детишкам-окнам.
N>но они в это время оказываются еще не досозданы. (это я вижу из SPY++)

N>подскажите, как дождаться конца достройки?

N>не таймаут же какой-нить ставить?!
N>ставить еще один хук по WM_INITDIALOG уже на сам дилог не хочется.

N>WaitForInputIdle не срабатывает, т.к. работает с процессом, а он "усегда готов!"

А WH_FOREGROUNDIDLE не помогает?

N>помогите, плз.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Ожидание создания диалога
От: niksap Россия  
Дата: 10.01.02 18:22
Оценка:
Здравствуйте 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). Все равно не срабатывает.
Best regards, Nik
Re[2]: Ожидание создания диалога
От: niksap Россия  
Дата: 10.01.02 18:29
Оценка:
Здравствуйте 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). Все равно не срабатывает.
Best regards, Nik
Re[2]: Ожидание создания диалога
От: niksap Россия  
Дата: 10.01.02 18:35
Оценка:
Здравствуйте 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 будет привязян к потоку/процессу, а мне, скорее, надо к окну.
Или я чего не понимаю?
Best regards, Nik
Re[3]: Ожидание создания диалога
От: Sergey Россия  
Дата: 11.01.02 08:27
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Ожидание создания диалога
От: TSS Россия http://www.sdl.ru
Дата: 11.01.02 08:43
Оценка:
Здравствуйте 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.
Signed, [TSS] /SDL/
Re[5]: Ожидание создания диалога
От: Sergey Россия  
Дата: 11.01.02 11:45
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Ожидание создания диалога
От: TSS Россия http://www.sdl.ru
Дата: 11.01.02 11:54
Оценка:
Здравствуйте 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> Что-то я не заметил слова "окно" в английмком тексте .

Поймал...
Обычнох для окна. А так -- не обязательно. Этот хук вообще касаеться очереди сообщений.

Кста, сработает он в любом случае, только для активного потока, а не любого.
Signed, [TSS] /SDL/
Re[7]: Ожидание создания диалога
От: Sergey Россия  
Дата: 11.01.02 13:42
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[8]: Ожидание создания диалога
От: ua1zcl Россия www.alexklm.ru
Дата: 15.01.02 23:37
Оценка:
Здравствуйте Sergey, Вы писали:

Можно по WM_ACTIVATE, послать родителю сообщение о готовности. Можно поставить будильник на пару милисекунд. А WaitForInputIdle хороша при запуске другого процесса, а тут, как я понял, это тот же процесс.
Александр
Re[9]: Ожидание создания диалога
От: niksap Россия  
Дата: 16.01.02 10:34
Оценка:
Здравствуйте ua1zcl, Вы писали:

U>Здравствуйте Sergey, Вы писали:


U>Можно по WM_ACTIVATE, послать родителю сообщение о готовности. Можно поставить будильник на пару милисекунд. А WaitForInputIdle хороша при запуске другого процесса, а тут, как я понял, это тот же процесс.


Родитель знать обо мне не знает и не обработает он меня.
Будильник и Sleep не получатся, так как поток то — тот же самый, т.к. тут происходит внедрение DLL с помощью ловушки. Получается, мне либо искуссвтенно еще один поток создавать, либо отказываться WM_ACTIVATE либо еще чего.
Best regards, Nik
Re: Ожидание создания диалога
От: ua1zcl Россия www.alexklm.ru
Дата: 16.01.02 16:02
Оценка:
Здравствуйте niksap, Вы писали:

Извините,я не врубился вовремя. 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 может подойти после соответсвующей обработки.
Остальное посмотрю по-позже.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.