Форум: "WinAPI";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c