Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.05;
Скачать: CL | DM;

Вниз

WindowProc - обработка сообщений окна   Найти похожие ветки 

 
dimod   (2002-10-21 12:49) [0]

Пишу программу, которая в итоге должна нормально выгрузиться и не тормозить завершение сеанса виндовс"а при нормальном выключении компа (Пуск->Завершение работы...->Выключить компьютер).
С этой программой иногда, достаточно продолжительной время компьютер не выключается (у меня АTX) или вообще не выключается, а висит чисто "экран" и есть указатель мыши, причем все приложения как-бы завершились (в т.ч. explorer).
Может кто подскажет как правильно реагировать на событие "завершение работы", может где-то что-то не так (в WindowProc). Вот куски кода моей проги:

...

function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
Result := 0;
{ Checks for messages }
case uMsg of
... : { обработка пользовательских сообщений }
WM_CLOSE, WM_DESTROY, WM_ENDSESSION, WM_QUERYENDSESSION :
begin
// освобождение ресурсов
// ожидание завершения потоков
PostQuitMessage(0);
Exit;
end
else
Result := DefWindowProc(hWnd, uMsg, wParam, lParam)
end; { case }
end; { WindowProc }

// -----------
begin
...

RegisterServiceProcess(0,1);

while (GetMessage(msg, 0, 0, 0)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
ExitProcess(0);
end.


 
Игорь Шевченко ©   (2002-10-21 12:53) [1]

Отладочную трассировку включать не пробовали ? Обычно помогает. В файл со сбросом буфера на диск :-)


 
dimod   (2002-10-21 13:41) [2]

Я на счет правильной последовательности обработки сообщений WM_ENDSESSION, WM_QUERYENDSESSION и WM_DESTROY хотел бы уточнить (в WindowProc)


 
Игорь Шевченко ©   (2002-10-21 13:51) [3]

PostQuitMessage надо посылать только на WM_DESTROY главного окна


 
dimod   (2002-10-21 17:21) [4]

Как мне обработать события WM_ENDSESSION и WM_QUERYENDSESSION,
чтобы не возникало таких сообщений типа " ... не отвечает на системные запросы", причем ... - пустое поле (и кто не отвечает - не известно, есть только подозрения на свою прогу).
Если можно, то кусочек кода вместо ???. Заранее спасибо.

function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
Result := 0;
{ Checks for messages }
case uMsg of
... : { обработка пользовательских сообщений }
WM_QUERYENDSESSION :
begin
// ?????
end;
WM_ENDSESSION:
begin
// ?????
end;
WM_DESTROY :
begin
// освобождение ресурсов
// ожидание завершения потоков
PostQuitMessage(0);
Exit;
end
else
Result := DefWindowProc(hWnd, uMsg, wParam, lParam)
end; { case }
end; { WindowProc }


 
Игорь Шевченко ©   (2002-10-21 17:22) [5]

Кусочки кода - в MSDN


 
dimod   (2002-10-24 13:48) [6]

Сделал так, пока работает


function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
Result := 0;
{ Checks for messages }
case uMsg of
WM_COPYDATA : ...;
WM_CLOSE :
begin
WriteToLogFile("WM_CLOSE.");
PostMessage(hWnd, WM_DESTROY, 0, 0);
end;
WM_ENDSESSION :
begin
WriteToLogFile("WM_ENDSESSION.");
if WordBool(wParam) then
begin
{ Windows is closing down - clean up!! }
MyCleanupProcedure;
Halt(0);
end;
end;
WM_DESTROY :
begin
WriteToLogFile("WM_DESTROY.");
MyCleanupProcedure;
PostQuitMessage(0);
Exit;
end;
end; { case }
Result := DefWindowProc(hWnd, uMsg, wParam, lParam)
end;



Страницы: 1 вся ветка

Текущий архив: 2002.12.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
1-14591
События
2002-11-27 13:33
2002.12.05
Если два различных Sender a вызывают одно событие


1-14606
Begin
2002-11-24 19:05
2002.12.05
Про изображения.


1-14572
alvin
2002-11-27 08:37
2002.12.05
Реестр в WinAPI


3-14423
Fixxxer
2002-11-17 21:29
2002.12.05
Сохранение изменений в базе данных...


1-14499
Михич
2002-11-26 08:21
2002.12.05
Даешь батоны произвольной формы!