Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2019-05

Detecting console close with red X on windows

9 messages · 5 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

James Richters

Is there a way I can detect that a user has pushed the red X in the upper right corner to close the console window in a free pascal console application so I can save some files before the program terminates?

James

Reply by email

Kevin Lyda
to James Richters

At least on Unix systems I'd assume the answer was to write a signal handler: https://www.freepascal.org/docs-html/rtl/baseunix/fpsigaction.html

Kevin

PM James Richters wrote 10 lines
Is there a way I can detect that a user has pushed the red X in the upper right corner to close the console window in a free pascal console application so I can save some files before the program terminates? James _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Kevin Lyda Galway, Ireland

Reply by email

Unknown author
to Kevin Lyda
Kevin Lyda wrote
At least on Unix systems I'd assume the answer was to write a signal handler: https://www.freepascal.org/docs-html/rtl/baseunix/fpsigaction.html

IME, that should always be done... especially in the *nix world... you never know where termination may come from and providing a clean exit is much preferable to an uncontrolled exit...

NOTE: No off-list assistance is given without prior approval. *Please keep mailing list traffic on the list unless* *a signed and pre-paid contract is in effect with us.*

Reply by email

James Richters
to Henry Vermaak

Could I please get an example of this? I see lots of examples of how to do it in C but when I try to translate to pascal I always struggle a quite a bit.

James

Earlier message 16 lines
From: fpc-pascal On Behalf Of Henry Vermaak Sent: Sunday, May 19, 2019 8:39 AM To: FPC-Pascal users discussions Subject: Re: [fpc-pascal] Detecting console close with red X on windows On Sun, 19 May 2019, 13:23 James Richters, < > wrote: Is there a way I can detect that a user has pushed the red X in the upper right corner to close the console window in a free pascal console application so I can save some files before the program terminates? You can do that with SetConsoleCtrlHandler() and catching CTRL_CLOSE_EVENT in the handler. Henry

Reply by email

Henry Vermaak
to James Richters
James Richters wrote
Could I please get an example of this? I see lots of examples of how to do it in C but when I try to translate to pascal I always struggle a quite a bit.

Have a look at the fpc source in packages/fv/src/w32msg.inc and search for SetConsoleCtrlHandler and then HandleConsoleCtrl. There's nothing to it, really.

Henry

Reply by email

James Richters
to Henry Vermaak

Thanks! That was quite helpful! I have a test program kind of working.

I notice I only get 5 seconds to do what I am going to before it closes, and I also notice that my program can no longer respond to keystrokes after I hit the red X. How do other programs get around this? For example if I open word for windows and type something and hit the X it asks if I want to save it and will wait indefinitely for a response. Is this a limitation because I am running console application, Is there a way I can do this with my console application as well?

Here is my test program:

uses crt,windows;
var x,y: longint;
    Closetheprogram:Boolean;
Function Console_Handler(dwCtrlType: Dword) : BOOL; stdcall;
Begin
  Console_Handler:=false;
  Case dwCtrlType of
    CTRL_CLOSE_EVENT,
    CTRL_LOGOFF_EVENT,
    CTRL_SHUTDOWN_EVENT :
      begin
         Console_Handler:=True;
         CloseTheProgram:=True;
          Writeln('start');
          For X:= 1 to 2000000 do  //this keeps the Console_Handler busy so my program continues to execute;
              Begin
                 sleep(1);
                 inc(y);
              end;
          Writeln('stop');
        Console_Handler:=True;
        CloseTheProgram:=True;
      end;
  end;
end;
Begin
CloseTheProgram:=False;
if SetConsoleCtrlHandler(@Console_handler, TRUE) then
   Writeln('Console CTRL Handler Installed')
else
   Writeln('Console CTRL Handler Not Installed');
Repeat
Write('.');
Sleep(100);
Until CloseTheProgram or keypressed;
If Keypressed then
Repeat
readkey;
Until not(Keypressed);
Repeat
Write(',');
Sleep(100);
Until keypressed;
Writeln(ClosetheProgram);
end.
Earlier message 13 lines
-----Original Message----- From: fpc-pascal On Behalf Of Henry Vermaak Sent: Sunday, May 19, 2019 11:44 AM To: FPC-Pascal users discussions Subject: Re: [fpc-pascal] Detecting console close with red X on windows On Sun, 19 May 2019 at 14:33, James Richters wrote: > > Could I please get an example of this? I see lots of examples of how to do it in C but when I try to translate to pascal I always struggle a quite a bit. Have a look at the fpc source in packages/fv/src/w32msg.inc and search for SetConsoleCtrlHandler and then HandleConsoleCtrl. There's nothing to it, really. Henry

Reply by email

Sven Barth
to James Richters

James Richters schrieb am So., 19. Mai
2019, 19:10:

Show quoted text 11 lines
Thanks! That was quite helpful! I have a test program kind of working. I notice I only get 5 seconds to do what I am going to before it closes, and I also notice that my program can no longer respond to keystrokes after I hit the red X. How do other programs get around this? For example if I open word for windows and type something and hit the X it asks if I want to save it and will wait indefinitely for a response. Is this a limitation because I am running console application, Is there a way I can do this with my console application as well

Correct, that is a limitation of the console no matter the operating system.

Regards,
Sven

Reply by email

James Richters
to Sven Barth

Thanks for clarifying, I have everything working well now in my real program, I didn’t need to do anything other than save and close some files, so I have plenty of time to get everything done.

James

Earlier message 23 lines
From: fpc-pascal On Behalf Of Sven Barth via fpc-pascal Sent: Sunday, May 19, 2019 1:15 PM To: FPC-Pascal users discussions Cc: Sven Barth Subject: Re: [fpc-pascal] Detecting console close with red X on windows James Richters < > schrieb am So., 19. Mai 2019, 19:10: Thanks! That was quite helpful! I have a test program kind of working. I notice I only get 5 seconds to do what I am going to before it closes, and I also notice that my program can no longer respond to keystrokes after I hit the red X. How do other programs get around this? For example if I open word for windows and type something and hit the X it asks if I want to save it and will wait indefinitely for a response. Is this a limitation because I am running console application, Is there a way I can do this with my console application as well Correct, that is a limitation of the console no matter the operating system. Regards, Sven

Reply by email