Hi, All! Взято из примера к книге(!): HWND wndHandle; // глобальная переменная- хэндл главного //и единственного окна приложения //.... создаем класс окна и само окно, показываем его и т.д. while (GetMessage(&msg, wndHandle, 0, 0) ) { ^^^--- в книге это, а не NULL TranslateMessage( &msg ); DispatchMessage( &msg ); } Если GetMessage вызывается со вторым параметром равным wndHandle, то после закрытия приложения окно благополучно удаляется, но приложение не выходит из цикла,- как я понимаю GetMessage не выбирает из очереди сообщение WM_QUIT. Если вторым параметром поставить NULL- все ОК. В связи с этим у меня возникли следующие вопросы: 1. Насколько законно/полезно использование wndHandle в качестве параметра GetMessage? 2. В чем разница между сообщениями отправленными потоку (см. MSDN) и окну? 3. И, наконец, почему же "висит" приложениие? Прошу прощения, если это дурацкий вопрос и на него уже где-то отвечали,- буду признателен за ссылку. Заранее благодарен. Zhenya48.
To mix_mix: Боюсь, Вы не совсем поняли вопрос. Я знаю про "волшебную" последовательность: WM_CLOSE->DestroyWindow(hWnd)->WM_DESTROY->PostQuitMessage(0)->WM_QUIT .Проблема в том, что при получении WM_QUIT GetMessage должна возвращать 0, при этом должен происходить выход из цикла while(GetMessage(...)). (Извините, что объясняю азбучные истины Все это работает при GetMessage(&msg, NULL, 0, 0), но при GetMessage(&msg, wndHandle, 0,0) после вызова PostQuitMessage(0) из оконной процедуры, GetMessage() не возвращает управления, и цикл не прерывается,- программа вистнет. Меня, собственно, интересует, в чем разница в работе GetMessage(), когда ей переданы в качестве второго параметра хэндл окна и когда- NULL. В MSDN на этот счет написано, что при NULL: " GetMessage retrieves messages for any window that belongs to the calling thread and thread messages posted to the calling thread via PostThreadMessage.", а при wndHandle: "GetMessage function only retrieves messages associated with the window identified by the hWnd parameter or any of its children". В MSDN также написано: "The PostQuitMessage function posts a WM_QUIT message to the thread's message queue", но мне непонятно, с чем же "связано" это сообщение: с окном или потоком. В связи с этим, хотелось бы узнать, в чем же разница между "оконными" сообщениями и "поточными"? Я подозреваю, что WM_QUIT является "поточным" сообщением, а PostQuitMessage(0) реализована через PostThreadMessage. Хотелось бы, чтобы кто-нибудь подтвердил или опровергнул мою догадку. Может, кто-то знает, что можно почитать по внутренней организации системы собщений. Я когда-то видел что-то в книге у Питтрека по этому поводу, но подробностей не помню, а книгу потерял Прошу прощения за большой пост, заранее благодарен. Zhenya48.
> в чем же разница между "оконными" сообщениями и "поточными"? > Я подозреваю, что WM_QUIT является "поточным" сообщением Правильно подозреваешь, но лучше сказать не "поточным" а "неоконным", т.к. все сообщения в очереди потока адресованы иму и созданным им окнам. "Оконные" сообщения адресованы конкретному hWnd. Но кроме оконных сообщений в очереди потока могут быть и неоконные сообщения, переданные PostThreadMessage, PostMessage(NULL,..) или PostQuitMessage. Соответсвенно если в GetMessage hWnd=NULL, то обрабатываются все сообщения из очереди потока, а если не NULL, то из очереди выбираются только сообщения для hWnd и его дочерних окон и ес-но неоконные сообщения типа WM_QUIT игнорируются
Zhenya48 Правильно. WM_QUIT посылается не окну, а треду, т.к. родительских окон может быть несколько, да и то окно, которое обработало WM_DESTROY к данному моменту уже не существует.