如何检测 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;
有没有人找到在 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;