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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2012, 14:28   #1
graveman
Пользователь
 
Регистрация: 10.01.2011
Сообщений: 15
По умолчанию Как отловить сообщение от WM_CLOSE от "крестика"?

Пытаюсь поймать сообщения о закрытии окна без обработчика окна. Ловятся клики и нажатия клавиш. От GetMessage не приходят сообщения WM_CLOSE и WM_DESTROY, когда я нажимаю на кнопку закрытия окна в системном меню (красный крестик). Вопрос - почему? И как поймать эти сообщения? Само окно кстати закрывается, а процесс продолжает висеть в памяти.
graveman вне форума Ответить с цитированием
Старый 01.10.2012, 15:05   #2
StIX-S
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 69
По умолчанию

С помощью чего создаёте окно?
StIX-S вне форума Ответить с цитированием
Старый 01.10.2012, 15:13   #3
graveman
Пользователь
 
Регистрация: 10.01.2011
Сообщений: 15
По умолчанию

Заполняю
Код:
WNDCLASSEX vWndClass;	// класс окна
vWndClass.lpfnWndProc = DefWindowProc;

RegisterClassEx(&vWndClass);

// Создаём окно
m_hWnd = CreateWindowEx(...
В коде главного цикла:
Код:
TCHAR buf[256];
FILE *f = fopen("log.txt", "w");

	while( (bRet = GetMessage( &vMsg, NULL, 0, 0 )) != 0 && !vQuit)
	{  
		StringCchPrintf(buf, 256, TEXT("msg=%x;"), vMsg.message);
		fwrite(buf, 1, 256, f);
		if (bRet == -1)
		{
			// Обработка ошибки и возможный выход из программы
			vQuit = true;
		}
		else if (vMsg.message == WM_QUIT)
		{
			vQuit = true;
		}
		else
		{
			SendMessage(&vMsg); //
			TranslateMessage(&vMsg); 
			DispatchMessage(&vMsg); 
		}
	}	 
fclose(f);

Последний раз редактировалось graveman; 01.10.2012 в 15:14. Причина: форматирование
graveman вне форума Ответить с цитированием
Старый 01.10.2012, 16:22   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Сначала пойдет WM_SYSCOMMAND/SC_CLOSE.
WM_DESTROY через очередь не проходит. Насчет WM_CLOSE не знаю.
Лучше всего паралельно смотреть через WinSpy что приходит в окно - тогда будет видно, что идет из очереди а что идет напрямую, через SendMessage()
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как можно отключить сообщение "поля раздела выходят за границы области печати. Продолжить?" Dadosh Microsoft Office Word 7 29.07.2012 11:58
Не получается в игре "Крестики-нолики" вывести нолик, после крестика (на php, с использованием div)) 777111 Помощь студентам 0 26.12.2011 22:24
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
TRichViewEdit - как отловить событие "курсор над таблицей" chandrasecar Компоненты Delphi 0 05.04.2009 20:04
Как вывести сообщение типа "внимание" при удалении записи из БД Alex_Sokolov Помощь студентам 7 06.01.2009 13:50