Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-43288
tv
2004-02-12 12:24
2004.03.14
Unicode строки в поле типа Memo


1-43506
td
2004-02-28 11:42
2004.03.14
Excel Application


1-43505
Rentgen
2004-02-28 18:46
2004.03.14
HTML To MHT


1-43529
Igg
2004-02-28 12:16
2004.03.14
Combox & Grid


1-43501
s
2004-03-03 18:54
2004.03.14
Настройка MAXFILEHANDLE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский