gpt4 book ai didi

delphi - 检测到 MessageBox 中的帮助按钮单击吗?

转载 作者:行者123 更新时间:2023-12-03 15:23:21 29 4
gpt4 key购买 nike

在 Delphi XE7 中,我需要使用 MessageBox 中的“帮助”按钮。 MSDN 指出:

MB_HELP 0x00004000L Adds a Help button to the message box. When the user clicks the Help button or presses F1, the system sends a WM_HELP message to the owner.

但是,当我单击 MessageBox 中的“帮助”按钮时,似乎没有将 WM_HELP 消息发送到应用程序:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
if Msg.message = WM_HELP then
CodeSite.Send('ApplicationEvents1Message WM_HELP');
end;

procedure TForm1.btnShowMessageBoxClick(Sender: TObject);
begin
MessageBox(Self.Handle, 'Let''s test the Help button.', 'Test', MB_ICONINFORMATION or MB_OK or MB_HELP);
end;

那么如何才能单击 MessageBox 帮助按钮以及如何检测它来自哪个 MessageBox?

最佳答案

文档说,我强调的是:

the system sends a WM_HELP message to the owner.

这是 MSDN 代码,说明消息直接同步传递到窗口过程。换句话说,它是使用 SendMessage 或等效 API 发送的。

您已尝试在用于拦截异步消息的TApplicationEvents.OnMessage 中处理它。即放置在消息队列中的消息。这些消息(通常)通过 PostMessage 放置在队列中。

因此,您从未在 TApplicationEvents.OnMessage 中看到该消息的原因是该消息从未放置在队列中。相反,您需要在所有者窗口的窗口过程中处理该消息。在 Delphi 中,最简单的方法如下:

type
TForm1 = class(TForm)
....
protected
procedure WMHelp(var Message: TWMHelp); message WM_HELP;
end;
....
procedure TForm1.WMHelp(var Message: TWMHelp);
begin
// your code goes here
end;

至于如何检测哪个消息框负责发送消息,在使用MessageBox时没有简单的方法。也许最好的办法是切换到 MessageBoxIndirect 。这允许您在 MSGBOXPARAMSdwContextHelpId 字段中指定 ID。 。该 ID 将传递给 WM_HELP 消息的接收者,如 documentation 中所述。 .

如果您要显示一个主题和一个帮助文件,以响应用户按下帮助按钮,那么您可以考虑 VCL 函数 MessageDlg 。这允许您传递帮助上下文 ID,框架将显示应用程序帮助文件,并传递该帮助上下文 ID。

关于delphi - 检测到 MessageBox 中的帮助按钮单击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29181910/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com