如何检测 Delphi FMX Windows 表单中的鼠标后退和前进按钮?

How detect the mouse back and forward buttons in a Delphi FMX Windows form?

有没有人找到在 Windows(并且只有 Windows)的 Delphi FMX 表单中检测鼠标后退和前进按钮的方法?

我知道这在 VCL 应用程序中工作正常,使用

procedure WMAppCommand(var Msg: Winapi.Messages.TMessage); message WM_APPCOMMAND;

但这对 FMX 应用程序没有影响。

如果有人已经找到解决方案,非常感谢您提供提示(当然是他们使用的代码)。

FMX 大量过滤 window 消息,只发送它实际使用的少数消息。 WM_APPCOMMAND 不是其中之一,这就是为什么简单的 message 处理程序不能像在 VCL 中那样在 FMX 中工作。

因此,您将不得不通过 SetWindowLongPtr(GWLP_WNDPROC) or SetWindowSubclass(), in order to intercept window messages before FMX sees them. See Subclassing controls.

直接手动子类化 TForm 的 Win32 HWND

进行该子类化的理想位置是重写 TForm.CreateHandle() method. You can use FMX's FormToHWND() 函数以在创建 TForm 后获取 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;

procedure TMyForm.CreateHandle;
begin
  inherited;
  SetWindowSubclass(FormToHWND(Self), @MySubclassProc, 1, DWORD_PTR(Self));
end;

procedure InitStandardClasses;
var 
  ICC: TInitCommonControlsEx;
begin
  ICC.dwSize := SizeOf(TInitCommonControlsEx);
  ICC.dwICC := ICC_STANDARD_CLASSES;
  InitCommonControlsEx(ICC);
end;

initialization
  InitStandardClasses;