Q&A

  • windows종료시 App를 종료하고 싶은데?
windows종료시 App를 종료하고 싶은데 잘 안되네요.

제가 두가지 방법으로 해보았습니다.

1.Application.OnMessage이용

- FormCreate시

Application.OnMessage:=AppMessage

- procedure AppMessage(msg:TMsg;var Handled:Boolean);

begin

case msg.Message of

WM_QUERYENDSESSION:begin

close;

inherited;

end;

end;

end;

위의 방법을 사용하면 메세지를 받지 못합니다.

2.Form의 Message를 이용

- 선언

procedure MsgHookProc(msg:TMessage);message WM_QUERYENDSESSION;

- 정의

procedure MsgHookProc(msg:TMessage);

begin

Close;

inherited;

end;

위와 같은 방법은 form이 떠 있으면 되는데 작업표시줄에 Minimize되어 있으면

======================================================

안됩니다.

========

왜 그럴까요?

4  COMMENTS
  • Profile
    jini 1999.07.22 21:23
    폼에 OnCloseQuery 이벤트가 있자나요..

    그거 사용해보세요.

    전 잘되는데...



    신상철 께서 말씀하시기를...

    > windows종료시 App를 종료하고 싶은데 잘 안되네요.

    > 제가 두가지 방법으로 해보았습니다.

    > 1.Application.OnMessage이용

    > - FormCreate시

    > Application.OnMessage:=AppMessage

    > - procedure AppMessage(msg:TMsg;var Handled:Boolean);

    > begin

    > case msg.Message of

    > WM_QUERYENDSESSION:begin

    > close;

    > inherited;

    > end;

    > end;

    > end;

    > 위의 방법을 사용하면 메세지를 받지 못합니다.

    > 2.Form의 Message를 이용

    > - 선언

    > procedure MsgHookProc(msg:TMessage);message WM_QUERYENDSESSION;

    > - 정의

    > procedure MsgHookProc(msg:TMessage);

    > begin

    > Close;

    > inherited;

    > end;

    > 위와 같은 방법은 form이 떠 있으면 되는데 작업표시줄에 Minimize되어 있으면

    > ======================================================

    > 안됩니다.

    > ========

    > 왜 그럴까요?





  • Profile
    구창민 1999.07.22 09:09
    신상철님 안녕하세요?

    혹, inherited 를 먼저 기술하시고, 테스트 해보셨나요?

    음.. 아래처럼 테스트 해보니 우선 잘 죽습니다.

    소스 올립니다. 보시고, 참조하시길..

    그럼.. 즐거운 프로그래밍 되세요~

    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;



    type

    TForm1 = class(TForm)

    private

    { Private declarations }

    procedure WindowEndingMsg(var Msg : TMessage); message WM_QUERYENDSESSION;

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}

    procedure TForm1.WindowEndingMsg(var Msg :TMessage);

    begin

    inherited;

    if Application.MessageBox('윈도우가 종료될라 카는데 같이 죽을 겁니까?','윈도우
  • Profile
    신상철 1999.07.22 17:33
    구창민 께서 말씀하시기를...

    > 신상철님 안녕하세요?

    > 혹, inherited 를 먼저 기술하시고, 테스트 해보셨나요?

    > 음.. 아래처럼 테스트 해보니 우선 잘 죽습니다.

    > 소스 올립니다. 보시고, 참조하시길..

    > 그럼.. 즐거운 프로그래밍 되세요~

    > unit Unit1;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

    >

    > type

    > TForm1 = class(TForm)

    > private

    > { Private declarations }

    > procedure WindowEndingMsg(var Msg : TMessage); message WM_QUERYENDSESSION;

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    > procedure TForm1.WindowEndingMsg(var Msg :TMessage);

    > begin

    > inherited;

    > if Application.MessageBox('윈도우가 종료될라 카는데 같이 죽을 겁니까?','윈도우
  • Profile
    구창민 1999.07.22 18:50
    구창민입니다.



    제차 테스트 해보아도 잘 동작됩니다.

    OS가 Win95인지요? 제가 테스트 해본

    환경은 Win98입니다. 저희 사무실에 Win95가 없어서

    Win95에서는 테스트 해보지 못했습니다.



    그리고 말씀하신 폼이 최소화 되어 있고, 포커스가 없어도

    메세지를 잘 전달 받습니다.



    실행된 모든 프로세스에게 윈도우 종료 메세지를 윈도우가

    전달하므로 제대로 받아야 정상인데...

    이상한 일이군요..



    시원한 답변을 드리지 못해 죄송합니다.

    그럼..