Главная страница
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.017 c
4-14855
Ich Hasse
2002-10-23 22:12
2002.12.05
Удаление рисунка из памяти


14-14812
cypher
2002-11-15 22:21
2002.12.05
Что за шняга?!!!


1-14578
Comp
2002-11-27 12:06
2002.12.05
Case <...> of <...>


14-14749
Anar
2002-11-13 18:32
2002.12.05
Что такое OST?


14-14796
paul_shmakov
2002-11-14 20:01
2002.12.05
предложение по улучшению поддержки форумом оперы, мозиллы и др.