在 Delphi FMX 应用程序中检测鼠标的后退和前进按钮(通常用于浏览器的导航)是一个常见的需求。由于 FMX 框架对窗口消息进行了过滤,标准的 WM_APPCOMMAND
消息处理方式在 FMX 中无效。因此,需要通过子类化窗体的 Win32 句柄(HWND)来拦截窗口消息。
- 1. 子类化窗体:
- • 使用
SetWindowSubclass
函数对窗体的 HWND 进行子类化,以拦截WM_APPCOMMAND
消息。 - • 在
TForm.CreateHandle
方法中执行子类化操作。
- • 使用
- 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