
我在windows 10上使用Delphi XE10在FMX项目
我试过的是下面的代码,但它不起作用
private { Private declarations } {$IFDEF MSwindows} procedure WMqueryEndSession(var Msg: TWMqueryEndSession); message WM_queryENDSESSION; procedure WMEndSession(var Msg : TWMqueryEndSession); message WM_ENDSESSION ; {$ENDIF} end;procedure TfMain.WMqueryEndSession(var Msg: TWMqueryEndSession);var Lista:TStringList;begin{$IFDEF MSwindows} try Lista:=TStringList.Create; Lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',Now)+' event WMqueryEndSession'); Lista.Savetofile(froot+formatdatetime('YYMMDDHHNNSSZZZ',Now)+'.log'); SincroClose(); Lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',Now)+' Done'); Lista.Savetofile(froot+formatdatetime('YYMMDDHHNNSSZZZ',Now)+'.log'); finally Lista.Free; end;{$ENDIF} inherited;end;procedure TfMain.WMEndSession(var Msg: TWMqueryEndSession);var Lista:TStringList;begin{$IFDEF MSwindows} try Lista:=TStringList.Create; Lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',Now)+' WMEndSession'); Lista.Savetofile(froot+formatdatetime('YYMMDDHHNNSSZZZ',Now)+'.log'); finally Lista.Free; end;{$ENDIF} inherited;end;procedure TfMain.FormClosequery(Sender: TObject; var CanClose: Boolean);var Lista:TStringList;begin{$IFDEF MSwindows} CanClose:=false; try Lista:=TStringList.Create; Lista.Add(FOrmatDateTime('DD/MM/YYYY HH:NN:SS',Now)+' FormClosequery'); Lista.Savetofile(froot+formatdatetime('YYMMDDHHNNSSZZZ',Now)+'.log'); CanClose:=true; finally Lista.Free; end;{$ENDIF}end; 只有正常的关闭应用程序,才能正常工作,在FormClosequery事件下,但是当windows关闭时,我的应用程序将关闭而不保存任何数据
解决方法 FormClosequery的工作原理是由框架公开的.由于您的邮件处理程序永远不会被调用,所以您的应用程序不会在windows关闭时保存任何数据.消息处理仅适用于VCL应用程序,fmx应用程序具有与 documented不同的消息传递机制.简要说明here意味着可以在fmx框架中接收来自OS的通知.但是,我不知道这是否包括关机通知,并且可以设置返回值,因为文档提到的消息对象只能被读取.
直到你知道fmx消息传递机制是如何工作的,如果它满足要求,你可以通过传统方式对你的窗体进行子类化.下面的示例使用Setwindowsubclass.
...protected {$IFDEF MSwindows} procedure CreateHandle; overrIDe; procedure DestroyHandle; overrIDe; procedure WMqueryEndSession(var Msg: TWMqueryEndSession); message WM_queryENDSESSION; procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION; {$ENDIF}...implementation{$IFDEF MSwindows}uses FMX.Platform.Win,WinAPI.Commctrl;function Subclassproc(Wnd: HWND; Msg: UINT; wParam: WParaM; lParam: LParaM; uIDSubclass: UINT_PTR; RefData: DWORD_PTR): LRESulT; stdcall;var Self: TfMain; Message: TMessage;begin Result := DefSubclassproc(Wnd,Msg,wParam,lParam); case Msg of WM_queryENDSESSION,WM_ENDSESSION: begin Self := TfMain(RefData); Message.Msg := Msg; Message.WParam := wParam; Message.LParam := lParam; Message.Result := Result; Self.dispatch(Message); Result := Message.Result; end; end;end;procedure TfMain.CreateHandle;var Wnd: HWND;begin inherited; Wnd := WindowHandletoPlatform(Self.Handle).Wnd; Setwindowsubclass(Wnd,Subclassproc,1,DWORD_PTR(Self));end;procedure TfMain.DestroyHandle;var Wnd: HWND;begin Wnd := WindowHandletoPlatform(Self.Handle).Wnd; Removewindowsubclass(Wnd,1); inherited;end;procedure TfMain.WMqueryEndSession(var Msg: TWMqueryEndSession);begin // do not call inherited here,there's no inherited handlingend;procedure TfMain.WMEndSession(var Msg: TWMEndSession);begin // do not call inherited here,there's no inherited handlingend;var ICC: tinitCommonControlsEx;initialization ICC.DWSize := SizeOf(ICC); ICC.DWICC := ICC_STANDARD_CLASSES; InitCommonControlsEx(ICC);{$ENDIF} 总结 以上是内存溢出为你收集整理的delphi – 如何在VCL项目中将Fmx项目中的Windows关闭事件作为WM_QUERYENDSESSION和WM_ENDSESSION?全部内容,希望文章能够帮你解决delphi – 如何在VCL项目中将Fmx项目中的Windows关闭事件作为WM_QUERYENDSESSION和WM_ENDSESSION?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)