Главная страница
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.013 c
1-14620
HanIP
2002-11-22 16:13
2002.12.05
Delphi 5


4-14861
TankMan
2002-10-21 00:43
2002.12.05
Помогите сделать тип данных....


3-14411
_stranger_
2002-11-15 16:26
2002.12.05
Ошибка при работе с ADOQuery с пустой таблицей при закрытии


1-14623
Test
2002-11-25 01:28
2002.12.05
Как сделать чтобы к каждому


3-14376
nikolo
2002-11-19 18:27
2002.12.05
ADO: TParameters.CreateParameter