RT
我在关闭Delphi程序的时候需要向INI文件中写点东西.
下次启动Delphi程序的时候需要读,在Delphi程序的OnClose事件中写了没问题,但我发现如果程序开着,然后将机器:开始->关闭计算机->关闭或者重新启动的时候,该事件无法出发,请教如何在这种情况下执行事件中的代码?

解决方案 »

  1.   

    拦截Windows关机,注销消息,如果有消息则写入你的ini
    procedure WMQueryEndSession(var Msg:TMessage); message WM_QueryEndSession;
      

  2.   

    WM_QUERYENDSESSION消息是Windows向你询问Windows能否关闭,WM_ENDSESSION消息表示提示你Windows即将关闭。故当应用程序退出时, WM_QUERYENDSESSION消息和WM_ENDSESSION消息均不响应。也就是说也就是说,你的程序在运行状态时,而系统由于某种原因需要注销或重启(或关机),此时操作系统会向你询问,但到你的同意(返回TRUE)后,系统才能做进一步的操作。    Windows 在注销、重起、关机之前会向每个当前正在运行的应用程序发送WM_QUERYENDSESSION消息,--> 如果该应用程序方便关闭的话,则在此消息的消息响应函数OnQueryEndSession()中返回非0值(TRUE),否则返回0值(FALSE)。--> 如果当前系统正在运行的应用程序全部返回非0值,则Windows的注销、重起、关机过程继续下去,并且向所有运行的应用程序发送WM_ENDSESSION消息,并且消息参数为TRUE;--> 如果当前系统正在运行的应用程序其中之一返回0值,则Windows的注销、重起、关机过程被终止,并且不再继续对剩余的应用程序调用OnQueryEndSession()消息响应函数,而是向已经调用过了OnQueryEndSession()消息响应函数的应用程序发送WM_ENDSESSION消息,并且消息参数为FALSE。   所以一个应用程序只要响应WM_ENDSESSION消息,并在WM_ENDSESSION消息的消息响应函数OnEndSession(BOOL bEnding) 中根据参数bEnding来判断系统最后是否真的要注销、重起、关机了,然后做出适当的反应即可。
      

  3.   

    windows只是发个消息给你的程序,你本没有权利去阻塞注销的过程,如果你的功能代码在指定时间(和机器速度和运行现场有关)无法执行完毕的话,Windows是不会给你机会让你搞完的。
      

  4.   

    关闭电脑时,Delphi程序会出发什么事件?这个问题已经回答完毕了!
      

  5.   


    在OnCloseQuery里写INI可能保险一点