覆盖标题栏按钮的工具提示文本(关闭,最大化,最小化,帮助)

我一直在努力改变为表单主标题栏上的按钮显示的工具提示的文本。

简而言之,我们利用Windows窗体的“帮助”按钮来实现其他目的。 这工作正常。 问题是,当鼠标hover在该按钮上时,会出现“帮助”工具提示,这对应用程序没有任何意义。

理想情况下,有一些方法可以为我的应用程序更改该工具提示的文本; 但是,在这一点上,我只是想找到一种完全禁用工具提示的方法。

我知道你可以通过在regedit中修改’UserPreferencesMask’键来禁用整个操作系统的工具提示,但我真的想要一种方法让它只影响我的应用程序。

同样,理想情况下,托管代码可能会有一些方法,但我不反对链接到Windows API等。

感谢您解决此问题的任何建议!

作为解决方法,您可能不会使用帮助按钮,而是:添加自定义按钮。

虽然这个样本不是那么完美,但它向你展示了这个想法。

这是一个非常有趣的问题。 我的第一个想法是使用GetSysMenu更改系统菜单。 我试图删除并重命名“关闭”项,但关闭按钮的工具提示没有改变。 然后我试图捕获工具提示窗口的HWND,但我没有成功。 如果我让表单(我在Delphi中工作)显示一个名为“Test”的工具提示,我可以通过FindWindow(nil,’Test’)得到它的HWND,然后我就可以发送SendMessage WM_CLOSE了。

在下面的示例代码中,我使用计时器来不断搜索工具提示。 这对性能不利,因此人们希望确切地找出工具提示出现的时间。 在这种情况下,当工具提示与客户端控件关联时,可以简单地使用OnHint事件。

procedure TForm1.Timer1Timer(Sender: TObject); var h: HWND; begin h := FindWindow(nil, 'Test'); if h <> 0 then SendMessage(h, WM_CLOSE, 0, 0); end; 

但是,当工具提示与标题栏按钮关联时,存在两个问题。

  1. 我无法使用FindWindow(nil,’Close’)获得关闭按钮的工具提示句柄;
  2. 如果我们能够获得句柄,我们需要一个聪明的地方来编写代码 – 我们不希望它在计时器中。 OnHint(在Delphi中 – 类似的事件存在于所有本机Win32应用程序中)可能只适用于客户端控件。 可以使用WM_NC *消息来推断何时显示标题栏工具提示。