在 Delphi FMX Windows 窗体中检测鼠标后退和前进按钮(接受win消息)

欢迎加入全网最大Delphi 技术交流群 682628230

在 Delphi FMX 应用程序中检测鼠标的后退和前进按钮(通常用于浏览器的导航)是一个常见的需求。由于 FMX 框架对窗口消息进行了过滤,标准的 WM_APPCOMMAND 消息处理方式在 FMX 中无效。因此,需要通过子类化窗体的 Win32 句柄(HWND)来拦截窗口消息。

 

  1. 1. 子类化窗体
    • • 使用 SetWindowSubclass 函数对窗体的 HWND 进行子类化,以拦截 WM_APPCOMMAND 消息。
    • • 在 TForm.CreateHandle 方法中执行子类化操作。
  2. 2. 处理 WM_APPCOMMAND 消息
    • • 在子类化过程中,处理 WM_APPCOMMAND 消息以检测鼠标的后退和前进按钮。

代码实现

以下是一个完整的实现示例:

uses
  FMX.Platform.Win, Winapi.Windows, Winapi.CommCtrl;

type
  TMyForm = class(TForm)
  protected
    procedure CreateHandle; override;
  end;

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
      // 处理鼠标后退和前进按钮
      if GET_APPCOMMAND_LPARAM(lParam) = APPCOMMAND_BROWSER_BACK then
        ShowMessage('Back button pressed')
      else if GET_APPCOMMAND_LPARAM(lParam) = APPCOMMAND_BROWSER_FORWARD then
        ShowMessage('Forward button pressed');
    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;

关键点

  • • 子类化窗体:通过 SetWindowSubclass 函数对窗体的 HWND 进行子类化,以拦截 WM_APPCOMMAND 消息。
  • • 处理 WM_APPCOMMAND 消息:在子类化过程中,处理 WM_APPCOMMAND 消息以检测鼠标的后退和前进按钮。
  • • 初始化标准控件:在初始化部分调用 InitStandardClasses 函数,确保标准控件类已初始化。

 

通过子类化窗体的 HWND,可以在 Delphi FMX 应用程序中成功检测鼠标的后退和前进按钮。这种方法适用于需要在 Windows 平台上处理特定鼠标按钮事件的场景。希望这篇文章能帮助你实现这一功能。

 

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享