Нажатие кнопки справки захвата с пользовательским стилем VCL
У меня есть форма VCL, которая установлена для bsDialog
с biHelp
включен (значок "?" на панели приложений). Приложение также использует собственный стиль VCL (Aqua Light Slate).
Однако я не могу получить WMNCLBUTTONDOWN
Сообщение Windows, которое появляется, когда я нажимаю "?" кнопка. Это работает только в том случае, если стиль VCL приложения изменяется на Windows (по умолчанию).
procedure TMainFrm.WMNCLButtonDown(var Msg: TWMNCLButtonDown);
begin
if Msg.HitTest = HTHELP then
begin
OutputDebugString('Help button down');
Msg.Result := 0;
end
else
inherited;
end;
procedure TMainFrm.WMNCLButtonUp(var Msg: TWMNCLButtonUp);
begin
if Msg.HitTest = HTHELP then
begin
OutputDebugString('Help button up');
Msg.Result := 0;
end
else
inherited;
end;
Есть ли способ заставить эти события срабатывать с помощью собственного стиля VCL?
1 ответ
Решение
Хук стиля формы обрабатывает это сообщение:
TFormStyleHook = class(TMouseTrackControlStyleHook)
....
procedure WMNCLButtonUp(var Message: TWMNCHitMessage); message WM_NCLBUTTONUP;
end;
Реализация включает в себя это
else if (Message.HitTest = HTHELP) and (biHelp in Form.BorderIcons) then
Help;
Это вызывает виртуальный Help
метод формы стиля крючка. Это реализовано так:
procedure TFormStyleHook.Help;
begin
SendMessage(Handle, WM_SYSCOMMAND, SC_CONTEXTHELP, 0)
end;
Так что вы можете просто слушать WM_SYSCOMMAND
и проверить wParam
за SC_CONTEXTHELP
, Как это:
type
TMainFrm = class(TForm)
protected
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
end;
....
procedure TMainFrm.WMSysCommand(var Message: TWMSysCommand);
begin
if Message.CmdType = SC_CONTEXTHELP then begin
OutputDebugString('Help requested');
Message.Result := 0;
end else begin
inherited;
end;
end;