Использование GetWindowText синхронно - PullRequest
1 голос
/ 19 февраля 2012

Я не совсем понимаю, как GetWindowText может работать для окна в том же потоке, что и вызывающая сторона.Если GetWindowText блокируется до обработки сообщения, как поток может вызвать DispatchMessage?Он был заблокирован внутри GetWindowText.Означает ли это, что GetWindowText всегда должен вызываться из отдельного потока, из которого выполняется цикл обработки сообщений?

1 Ответ

7 голосов
/ 19 февраля 2012

GetWindowText - это просто тонкая оболочка для SendMessage(WM_GETTEXT).

Сообщения, отправленные окну, всегда обрабатываются в потоке, который создал окно (окна имеют «сродство к потоку»). Отправленные сообщения не проходят через DispatchMessage, скорее GetMessage (или PeekMessage или MsgWaitForMultipleObjects) будут вызывать оконную процедуру напрямую для сообщений, отправленных из другого потока. Если сообщение отправлено из того же потока, SendMessage вызовет оконную процедуру.


Документация SendMessage гласит:

Функция SendMessage вызывает оконную процедуру для указанного окна и не возвращается, пока оконная процедура не обработает сообщение.

И документация GetMessage гласит :

Извлекает сообщение из очереди сообщений вызывающего потока. Функция отправляет входящие отправленные сообщения, пока опубликованное сообщение не станет доступным для извлечения.

Из PeekMessage документов :

Отправляет входящие отправленные сообщения, проверяет очередь сообщений на наличие опубликованных сообщений и извлекает сообщение (если оно существует).


Поведение отправки сообщений ранее было выделено на Отличный блог Раймонда Чена, The Old New Thing , на который все разработчики Win32 должны подписаться:

Если вы используете любую из вышеперечисленных функций типа send для отправки сообщения в окно, которое принадлежит потоку-отправителю, вызов выполняется синхронно.

Напомним, что SendMessage доставляет сообщение непосредственно в оконную процедуру; насос сообщений никогда его не видит.


И, конечно же, в StackOverflow можно найти похожие вопросы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...