delphi – 如何在VCL项目中将Fmx项目中的Windows关闭事件作为WM_QUERYENDSESSION和WM_ENDSESSION?

delphi – 如何在VCL项目中将Fmx项目中的Windows关闭事件作为WM_QUERYENDSESSION和WM_ENDSESSION?,第1张

概述我需要拦截 Windows关闭,并执行一些DB查询,之后我的应用程序将关闭. 我在Windows 10上使用Delphi XE10在FMX项目 我试过的是下面的代码,但它不起作用 private { Private declarations } {$IFDEF MSWINDOWS} procedure WMQueryEndSession(var Msg: TWMQueryEnd 我需要拦截 Windows关闭,并执行一些DB查询,之后我的应用程序将关闭.
我在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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1278782.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存