GetMessage не принимает WM_QUIT

Тема в разделе "WASM.BEGINNERS", создана пользователем Zhenya48, 10 окт 2005.

  1. Zhenya48

    Zhenya48 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2005
    Сообщения:
    2
    Адрес:
    Хабаровск
    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.
     
  2. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Попробуй использовать вместо WM_QUIT WM_DESTROY
     
  3. Zhenya48

    Zhenya48 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2005
    Сообщения:
    2
    Адрес:
    Хабаровск
    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.

    Хотелось бы, чтобы кто-нибудь подтвердил или опровергнул мою догадку.



    Может, кто-то знает, что можно почитать по внутренней организации системы собщений.

    Я когда-то видел что-то в книге у Питтрека по этому поводу, но подробностей не помню, а книгу потерял :dntknw:

    Прошу прощения за большой пост, заранее благодарен.

    Zhenya48.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > в чем же разница между "оконными" сообщениями и "поточными"?

    > Я подозреваю, что WM_QUIT является "поточным" сообщением

    Правильно подозреваешь, но лучше сказать не "поточным" а "неоконным", т.к. все сообщения в очереди потока адресованы иму и созданным им окнам. "Оконные" сообщения адресованы конкретному hWnd. Но кроме оконных сообщений в очереди потока могут быть и неоконные сообщения, переданные PostThreadMessage, PostMessage(NULL,..) или PostQuitMessage.

    Соответсвенно если в GetMessage hWnd=NULL, то обрабатываются все сообщения из очереди потока, а если не NULL, то из очереди выбираются только сообщения для hWnd и его дочерних окон и ес-но неоконные сообщения типа WM_QUIT игнорируются
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Zhenya48

    Правильно. WM_QUIT посылается не окну, а треду, т.к. родительских окон может быть несколько, да и то окно, которое обработало WM_DESTROY к данному моменту уже не существует.