Delphi 未在HTHELP按钮上激发Windows消息

Delphi 未在HTHELP按钮上激发Windows消息,delphi,windows-messages,Delphi,Windows Messages,我有一个VCL表单,该表单设置为bsDialog,启用了biHelp(应用程序栏中的“?”图标) 我举这个例子: 但是,我无法在单击“”按钮时显示WMNCLBUTTONDOWNWindows消息。它似乎只有在我点击标题栏时才会启动(就像我要拖动窗口一样) 代码: 同样,当我单击标题栏时,我会看到“Pre-Help”(预帮助)消息,但当我单击“”时不会看到按钮。这是为什么?我试图在单击该按钮时显示一个单独的表单。ShowMessage的模式消息循环会干扰消息处理。例如,使用OutputDebugS

我有一个VCL表单,该表单设置为
bsDialog
,启用了
biHelp
(应用程序栏中的“?”图标)

我举这个例子:

但是,我无法在单击“”按钮时显示
WMNCLBUTTONDOWN
Windows消息。它似乎只有在我点击标题栏时才会启动(就像我要拖动窗口一样)

代码:


同样,当我单击标题栏时,我会看到“Pre-Help”(预帮助)消息,但当我单击“”时不会看到按钮。这是为什么?我试图在单击该按钮时显示一个单独的表单。

ShowMessage的模式消息循环会干扰消息处理。例如,使用
OutputDebugString
查看消息是否按预期触发:

type
  TMainFrm = class(TForm)
  protected
    procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown); 
      message WM_NCLBUTTONDOWN;
    procedure WMNCLButtonUp(var Msg: TWMNCLButtonUp); 
      message WM_NCLBUTTONUP;
  end;
....
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;

请记住,按钮在释放之前是不会被按下的。因此,当按钮按下时,您不应该执行类似于显示对话框的操作。在显示另一个对话框之前,请等待
WM\u nclbutnup

当您显示消息框时,您会中断消息序列。当同时显示消息框。如果没有调试对话框,您是否仍会遇到同样的问题?使用
OutputDebugString
录制消息而不干扰其他操作。感谢您对
OutputDebugString
的建议。我仍然没有得到任何帮助调试输出。如果我添加e> OutputDebugString('WMNCLBUTTONDOWN')在
if Msg.HitTest=HTHELP
if块之外,我仍然在调试输出中看到它。还有其他建议吗?不需要任何其他建议。您只需使用我答案中的代码。您将看到“帮助”按钮和“帮助”按钮的输出。我相信您知道在哪里可以找到此输出,是吗?是的,我是说我看到了输出,但前提是我在
if Msg.HitTest=HTHELP
块之外添加了一些内容。我在任何时候都看不到“Help button down/up”输出。我回答中的代码在button down和button up上都产生输出。好的,我发现了差异。我的项目使用自定义样式(项目选项>应用程序>外观>Aqua Light Slate)。默认样式不是Windows。当项目设置为Windows时,上述代码按预期工作。在应用程序中使用自定义样式时,是否无法捕获相同的行为?
type
  TMainFrm = class(TForm)
  protected
    procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown); 
      message WM_NCLBUTTONDOWN;
    procedure WMNCLButtonUp(var Msg: TWMNCLButtonUp); 
      message WM_NCLBUTTONUP;
  end;
....
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;