FMX大量过滤窗口消息,只调度它自己实际使用的几个消息。WM_APPCOMMAND不是其中之一,这就是为什么简单的message处理程序不能像在VCL中那样在FMX中工作。
因此,你必须通过SetWindowLongPtr(GWLP_WNDPROC)或SetWindowSubclass()直接手动派生TForm的Win32 HWND子类,以便在FMX看到窗口消息之前截获它们。参见Subclassing controls。
进行该子类化的理想位置是覆盖TForm.CreateHandle()方法。在创建TForm之后,您可以使用FMX的FormToHWND()函数来获取它的HWND。
protected
procedure CreateHandle; override;
...
uses
FMX.Platform.Win, Winapi.Windows, Winapi.CommCtrl;
function MySubclassProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM;
uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): LRESULT; stdcall;
begin
case uMsg of
WM_APPCOMMAND: begin
// use TMyForm(dwRefData) as needed...
end;
WM_NCDESTROY:
RemoveWindowSubclass(hWnd, @MySubclassProc, uIdSubclass);
end;
Result := DefSubclassProc(hWnd, uMsg, wParam, lParam);
end;