Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
ВнизКак узнать, что программа будет закрыта, если нет формы Найти похожие ветки
← →
Vilux (2004-02-18 16:30) [0]Subj. Пишу проект без формы, т.е. в dpr-файле. Нужно узнать, что программа будет закрыта, например, перед отключением компьютера. Как это отловить?
← →
Тимохов (2004-02-18 16:36) [1]Вообще без формы?
И без application.run?
Тогда, нужно самому сделать функцию получения и обработки сообщений. ИМХО.
← →
Игорь Шевченко (2004-02-18 16:49) [2]SetConsoleCtrlHandler ?
← →
Vilux (2004-02-19 10:47) [3]Делаю так, но при попытке шатдауна выскакивает сообщение, что программа не отвечает и будет закрыта... т.е. код не срабатывает. Почему? И еще вопрос, как в данном случае отдавать время другим процессам? Раньше можно было Application.Processmessages, а в данном случае как?
program Project1;
uses
windows,dialogs;
var b:boolean;
function Ctrl_Handler(Ctrl: Longint): LongBool;
begin
if Ctrl in [CTRL_SHUTDOWN_EVENT, CTRL_LOGOFF_EVENT] then
begin
showmessage("asfasgasg");
sleep(5000);
b:=true;
end
else
begin
// Am I creator?
end;
Result := true;
end;
begin
b:=false;
SetConsoleCtrlHandler( @Ctrl_Handler,TRUE );
repeat
until b;
end.
← →
Тимохов (2004-02-19 10:50) [4]
> время другим процессам
Зря спросил это - сейчас на тебя накинутся.
Представляешь как windows вообще работает? Ты думаешь если ты не отдашь время другим процессам windows будет здать? Не фига - сам возьмет когда ему будет нужно.
Упомянутый тобой processmessages к отдаче времени другим процессам отношения не имеет.
← →
Тимохов (2004-02-19 10:53) [5]Зачем здесь sleep()?
← →
Verg (2004-02-19 11:05) [6]
> [4] Тимохов © (19.02.04 10:50)
>
> Представляешь как windows вообще работает? Ты думаешь если
> ты не отдашь время другим процессам windows будет здать?
> Не фига - сам возьмет когда ему будет нужно.
Так то оно так, только все потоки, которые имеют приоритет ниже чем у того, который выполняет, анпример, вот это:
> repeat
> until b;
не получат квантов времени т.е. встанут.
Как говорил Рихтер - такой цикл - это худшее, что можно сделать...
← →
Тимохов (2004-02-19 11:09) [7]
> Verg © (19.02.04 11:05) [6]
Про приоритет ничего в вопросе не было.
← →
Verg (2004-02-19 11:48) [8]Без консоли по-моему не обойтись.
Попробуй так:
program Project1;
{$APPTYPE CONSOLE}
uses
windows,dialogs, sysutils;
var b: THandle;
function Ctrl_Handler(Ctrl: Longint): LongBool; stdcall;
begin
if Ctrl in [CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT] then
begin
showmessage("asfasgasg");
SetEvent(b);
Result := true;
end
else
begin
// Am I creator?
Result := false;
end;
end;
begin
b:=CreateEvent(nil, true, false, nil);
try
if not SetConsoleCtrlHandler( @Ctrl_Handler,TRUE ) then
begin
ShowMessage(IntToStr(GetLastError));
exit;
end;
WaitForSingleObject(b, INFINITE);
finally
CloseHandle(B);
end;
end.
← →
Vilux (2004-02-25 11:39) [9]А куда девать это консольное окошко? Как его убрать с экрана?
← →
PVOzerski (2004-02-25 12:23) [10]Ребятки, да зачем же контрол-брейк в GUI-приложении ловить? Ловить-то сообщения, приходящие на хэндл окошка, надо. Вот, навскидку, из Help"а, может, подойдет?
Windows 95:
WM_QUERYENDSESSION
nSource = (UINT) wParam; // source of end-session request
fLogOff = (BOOL) lParam // logoff flag
Windows NT:
WM_QUERYENDSESSION
nSource = (UINT) wParam; // source of end-session request
The WM_QUERYENDSESSION message is sent when the user chooses to end the Windows session or when an application calls the ExitWindows function. If any application returns zero, the Windows session is not ended. Windows stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.
After processing this message, Windows sends the WM_ENDSESSION message with the wParam parameter set to the results of the WM_QUERYENDSESSION message.
Parameters
nSource
Value of wParam. Specifies the source of the request to end the Windows session. This parameter is zero if the request occurred because the user clicked the Logoff or Shutdown button in the Shut Down Windows dialog box. This parameter is nonzero if the user clicked the End Task button in the Task List dialog box.
fLogOff
Windows 95 only: Value of lParam. Indicates whether the user is logging off or shutting down the system. This parameter is TRUE if the user is logging off; it is FALSE if the user is shutting down the system.
Return Value
If an application can terminate conveniently, it should return TRUE; otherwise, it should return FALSE.
Default Action
The DefWindowProc function returns TRUE.
Remarks
Note that lParam is not used on the Windows NT platform, but is used on the Windows 95 platform.
See Also
DefWindowProc, ExitWindows, WM_ENDSESSION
← →
Vilux (2004-02-25 15:04) [11]Так окошка то нету, как такового...формы не существует, вот и вопрос, как ловить?
← →
Cobalt (2004-02-25 16:26) [12]Достаточно инициировать очередь сообщений (кажется, вызвать PeekMessage)
Правда, надо проверить, посылается оно окну, или посылается в очередь процесса...
← →
PVOzerski (2004-02-25 16:30) [13]Надо бы поэкспериментировать, не поймает ли соответствующее сообщение окошко, если оно - hidden.
← →
BlackTiger (2004-02-25 16:43) [14]А
Application.OnClose
не подходит?
← →
Vilux (2004-02-28 08:45) [15]Народ, ну нету Application, нету, когда просто проект создаешь без формы. А форму я не хочу делать. даже невидимой, потому что моя цель, не подключать лишние модули, если можно по идее обойтись без них. Только не получается пока...
P.S. Если работать с формой, то я и так знаю, как это реализовать.
← →
Verg (2004-02-28 08:52) [16]Так а чего ж ты Service-то не хочешь делать?
← →
Vilux (2004-02-29 09:31) [17]Можно подробнее про Service? Я не уловил мысль... может я этого не знаю?
← →
Gero (2004-02-29 09:58) [18]Вот в общем готовый скелет программы(выдирал из Forms.pas)
var FTerminate : Boolean;
function ProcessMessage(var Msg: TMsg): Boolean;
begin
Result := False;
if not PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then Exit;
Result := True;
if Msg.Message <> WM_QUIT then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end
else
FTerminate := True;
end;
procedure ProcessMessages;
var
Msg: TMsg;
begin
while ProcessMessage(Msg) do ;
end;
procedure Run;
var
Msg: TMsg;
begin
repeat
try
ProcessMessage(Msg);
except
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
end;
until Terminated;
end;
procedure Terminate;
begin
PostQuitMessage(0);
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.013 c