Приветствую, джентльмены Проблема возникла нежданно-негаданно. Согласно MSDN хуки вызываются системой _до_ того, как сообщение попадает в очередь отслеживаемого треда. Речь сейчас о system-wide хуках, которые в DLL живут. Так вот, картина маслом. Если подопечный тред в саспенде, то повешенный (хоть глобальный, хоть конкретно на него) хук не отрабатывает. Как только тред резюмится - все накопленные (где?!) нотификации сыплются в колбэки. Помогите добыть эти нотификации для спящего треда плиз. Где ковырять?
С чего это ты взял ? Хуки, связанные с виндовыми сообщениями, вызываются в момент вызова потоком Get\PeekMessage или передачи сообщения в оконную процедуру. Причина простая -чтобы безопасно "вклинить" вызов постороннего хука в код потока, нужно чтобы этот поток находился в некотором известном состоянии, а не в каком-то "неопределенно-подвешенном" какое может быть на моент его останова по suspend и т.п.
leo Из MSDN. Есть хуки не относящиеся напрямую к виндовым сообщениям, например WH_CBT Так вот это все before на деле не всегда таковым является. И даже если сообщение POST'ится в очередь то постящему треду не обязательно знать состояние целевого треда, на то очереди и придуманы - когда нужно будет целевой тред сам заберет сообщение из очереди в подходящем состоянии. Ан нет, система внутри откладывает сообщения до момента когда тред резюмнется. В общем, вопрос остается открытым.
punxer Спасибо за ссылку, сейчас посмотрю. UPDATE: прочел. Много полезной инфы, но вопрос диспетчеризации и фильтрации хуков по активным/саспендженным тредам, увы, не раскрыт. Так что, ребята, подскажете функцию, где принимается решение вызова/не вызова хука?