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