Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2011, 18:20   #1
llqs
 
Регистрация: 24.04.2011
Сообщений: 6
По умолчанию Идентификатор окна в PeekMessage

Для процесса создаю окно с хэндлом hWnd. В цикле,функцией PeekMessage "вынимаю" сообщения из очереди, причем аргумент хэндл, для какого окна нужно отлавливать сообщения, ставлю именно этот. По закрытию окно исчезает, но процесс остается висеть в памяти, хотя когда аргументом передаю NULL:
Цитата:
If hWnd is NULL, PeekMessage retrieves messages for any window that belongs to the current thread ...
то закрывается окно, и завершается процесс. Почему передавая handle окна, этого не происходит?

PHP код:
#include <windows.h>

LRESULT WINAPI MsgProcHWND hWndUINT msgWPARAM wParamLPARAM lParam );

INT WINAPI WinMain(HINSTANCE hInstanceHINSTANCE hPrevInstanceLPSTR lpCmdLineINT nCmdShow)
{
    
WNDCLASS wc;
    
HWND hWnd;
    
MSG msg;

    
wc.style CS_OWNDC;
    
wc.lpfnWndProc MsgProc;
    
wc.cbClsExtra 0;
    
wc.cbWndExtra 0;
    
wc.hInstance hInstance;
    
wc.hIcon LoadIcon(NULLIDI_APPLICATION);
    
wc.hCursor LoadCursor(NULLIDC_ARROW);
    
wc.hbrBackground = (HBRUSH)(6);
    
wc.lpszMenuName NULL;
    
wc.lpszClassName L"class";

    
RegisterClass(&wc);

    
hWnd CreateWindow(L"class"L"My Window Text"WS_OVERLAPPEDWINDOW150100500500NULLNULLhInstanceNULL);
    
ShowWindow(hWndnCmdShow);
    
UpdateWindow(hWnd);

    
PeekMessage(&msghWnd00PM_REMOVE);

    while(
msg.message != WM_QUIT)
    {
                
//а работает если: if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0)
        
if(PeekMessage(&msghWnd00PM_REMOVE) != 0)
        {
            
TranslateMessage(&msg);
            
DispatchMessage(&msg);
        }
    }

    
UnregisterClass(L"class"wc.hInstance);
    return 
0;
}

LRESULT WINAPI MsgProcHWND hWndUINT messageWPARAM wParamLPARAM lParam )
{
    switch(
message)
    {
        case 
WM_DESTROY:
            {
                
PostQuitMessage(0);
                return 
0;
            }
    }

    return 
DefWindowProc(hWndmessagewParamlParam);

llqs вне форума Ответить с цитированием
Старый 28.05.2011, 21:14   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
PostQuitMessage(0)
потому что эта функция передает окно в очередь потока, адресата-окна этого сообщения нет.
потому PeekMessage его не видит.
итог условие
Код:
while(msg.message != WM_QUIT)
не наступает.

да и вообще, зачем вам явное указание окна?
как показывает практика фича редко нужная(а если и не уметь, то вредная, как видите)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
идентификатор в паскале drcoxer Паскаль, Turbo Pascal, PascalABC.NET 28 13.11.2011 14:22
Ошибка: необъявленный идентификатор. Romantik (Dima) Общие вопросы C/C++ 1 16.12.2010 19:23
Идентификатор строки eda Microsoft Office Excel 9 25.08.2009 21:56
Идентификатор в DBF mixer94 БД в Delphi 10 14.07.2009 13:56
Уникальный идентификатор romets Win Api 9 03.02.2008 02:30