В книге Джеффри Рихтера "Windows для профессионалов" написано, что поток владеет созданным им окном. Если поток вызывает функцию CreateWindow, то с потоком ассоциируется структура THREADINFO. В этой структуре содержатся поля очереди синхронных и асинхронных сообщений и некоторые другие. А как насчет того, если этот же поток создаст второе, третье....окно? Что для каждого из окон создается еще одна структура THREADINFO? И второй вопрос: программа может иметь два окна консольное и созданное с помощью функции CreateWindow. События приходящие к нормальному окну обрабатывает поток, который создал это окно. А какой поток обрабатывает события которые приходят к консольному окну?
Bill_Prisoner 1. Структура одна на поток по идее. И создается она вроде при создании не окна, а очереди сообщений. 2. Насколько мне удалось понять, "Консольные окна" имеют лишь посредственное отношения к нормальным окнам. Механизм сообщений в их отношении может и отсутствовать, поскольку он исповедуется user32.dll, а все функции работы с консолью относятся к kernel32.dll. Если бы консольные окна работали через сообщения в контексте процесса(и потока) который их создает, то при трассировке (или приостановке потока) блокировалась бы их отрисовка и ввод. Мне намекнули что возможно консольные окна рисуются в режиме ядра. Еще что интересно - консольные окна позволяют отображать диалоговое окно настроек, сообщения которого обрабатываются в контексте процесса. Стало быть user32.dll при этом подгружается динамически. [edited] Сначала загружается console.dll, из которой вызывается функция CPlApplet, которая уже и отображает диалог настроек. Либа user32.dll указана в разделе импорта console.dll
AFAIK, окна не имеют собственных очередей сообщений. Все оконные сообщения(синхр. и асинхр.), посланные окнам потока из другого потока, складируются в очереди потока и раздаются окнам при вызове Get(Peek)Message. Консольные окна создаются и отрисовываются в user mode (в процессе csrss.exe)
green Стало быть и Window(Class) Extra Memory тоже находятся в ведении csrss.exe? А то я тут в соседнем топике пытался выяснить, почему с консольным окном по описателю GetWindowLong работает, а SetWindowLong нет (ошибка ERROR_ACCESS_DENIED).
green Это верно - они работают с АП текущего процесса. Другое дело каким образом тогда симулируется выполнение GetWindowLong (она возвращает нормальные значения). Кстати GetWindowLong (hConWnd, GWL_WNDPROC) возвращает 0FFFF05D3h - адрес странный даже для ring0.