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

时间:2010-03-30 21:45:42

标签: c# winforms winapi tooltip winforms-interop

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

这是一个非常有趣的问题。我的第一个想法是使用GetSysMenu更改系统菜单。我尝试删除并重命名“关闭”项,但关闭按钮的工具提示没有改变。然后我试图捕获工具提示窗口的HWND,但我没有成功。如果我让表单(我在Delphi中工作)显示一个名为“Test”的工具提示,我可以通过FindWindow获取其HWND(nil,'Test'),然后我可以将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,'关闭');
  2. 如果我们能够获得句柄,我们需要一个聪明的地方来编写代码 - 我们不希望它在计时器中。 OnHint(在Delphi中 - 类似的事件存在于所有本机Win32应用程序中)可能只适用于客户端控件。有人可能会使用WM_NC *消息来推断何时显示标题栏工具提示。