Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизЗавершение программы Найти похожие ветки
← →
Фагот (2004-07-30 15:01) [0]Здравствуйте!
Не бейте кирпичом по голове. Мне необходимо, чтобы при завершении работы Windows моя консольная программа тоже завершала работу и окно с принудительным завершением не выходило..
← →
GrayFace (2004-07-30 15:27) [1]Можно создать окно, а когда ему шлют WM_close, завершать прогу.
← →
olookin © (2004-07-30 15:30) [2]Не вижу разницы между консольным приложением и обычным окном. Поэтому отловить WM_QUERYENDSESSION и потом сделать что требуется.
← →
Юрий Зотов © (2004-07-30 17:04) [3]> olookin © (30.07.04 15:30) [2]
> Не вижу разницы между консольным приложением и обычным окном.
А она есть. Точнее, может быть, а может и не быть - смотря как написать программу.
> Поэтому отловить WM_QUERYENDSESSION и потом сделать что
> требуется.
Вот-вот. А что значит - "отловить"? Это значит - написать код, срабатывающий при приходе WM_QUERYENDSESSION. А как этот код сработает - сам по себе, что ли? Нет, его кто-то вызвать должен. Вот и вопрос - а кто?
И получается, что программа должна содержать цикл выборки сообщений и процедуру их обработки. Которые в обычной консольной программе не нужны - вот и отличие.
← →
olookin © (2004-07-30 18:18) [4]Фагот (30.07.04 15:01)
Я нашел некий пример:
Все процессы получают сигналы CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT и CTRL_SHUTDOWN_EVENT. А делается это (грубо говоря :) так:
BOOL Ctrl_Handler( DWORD Ctrl )
{
if( (Ctrl == CTRL_SHUTDOWN_EVENT)
|| (Ctrl == CTRL_LOGOFF_EVENT)
)
{
// Вау! Юзер обламывает!
}
else
{
// Тут что-от другое можно творить. А можно и не творить :-)
}
return TRUE;
}
===
function Ctrl_Handler(Ctrl: Longint): LongBool;
begin
if Ctrl in [CTRL_SHUTDOWN_EVENT, CTRL_LOGOFF_EVENT] then
begin
// Вау, вау
end
else
begin
// Am I creator?
end;
Result := true;
end;
===
А где-то в программе:
SetConsoleCtrlHandler( Ctrl_Handler, TRUE );
Таких обработчиков можно навесить кучу. Если при обработке какого-то из
сообщений обработчик возвращет FALSE, то вызывается следующий обработчик. Можно насторить таких этажерок, что ого-го :-)))
Короче, смотри описание SetConsoleCtrlHandler -- там всё есть.
Но сам так и не понял, как это заставить работать. Именно, не пойму, как передать в параметр Ctrl_handler нужное сообщение. Надеюсь, у тебя получится .
← →
Кириешки © (2004-07-30 18:21) [5]>olookin © (30.07.04 18:18) [4]
То же самое хотел написать ;))
← →
Zelius © (2004-07-30 19:07) [6]
> Но сам так и не понял, как это заставить работать. Именно,
> не пойму, как передать в параметр Ctrl_handler нужное сообщение.
> Надеюсь, у тебя получится .
Это не ты должен туда передавать параметр, а винда передаст, а тебе надо только правильно его отработать.
← →
Юрий Зотов © (2004-07-30 19:13) [7]> не пойму, как передать в параметр Ctrl_handler нужное
> сообщение.
Это не сообщение. Это адрес нашей callback-функции, которую система вызовет САМА и передаст ей информацию о причине вызова. См. HandlerRoutine в справке API.
program Project1;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
var
ExitFlag: boolean = False;
function CtrlHandler(Reason: DWORD): BOOL; stdcall;
begin
Result := True; // Не вызывать стандартный обработчик
ExitFlag := True;
end;
begin { main }
Win32Check(SetConsoleCtrlHandler(@CtrlHandler, True));
while not ExitFlag do
begin
...
end
end.
← →
olookin © (2004-07-30 20:37) [8]Юрий Зотов © (30.07.04 19:13) [7]
Значит, если я правильно понял, в примере ошибка?
Т.е.
"А где-то в программе:
SetConsoleCtrlHandler(Ctrl_Handler, TRUE );"
должно было выглядеть как
"А где-то в программе:
SetConsoleCtrlHandler(@Ctrl_Handler, TRUE );"
Так?
← →
Юрий Зотов © (2004-07-30 20:47) [9]> olookin © (30.07.04 20:37) [8]
Если не написать @, то компилятор может выдать сообщение об ошибке. А суть одна и та же.
← →
olookin © (2004-07-30 20:50) [10]Юрий Зотов © (30.07.04 20:47) [9]
Вот именно что выдавал ошибку.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c