C# 替代标题栏按钮的工具提示文本(关闭、最大化、最小化、帮助)

C# 替代标题栏按钮的工具提示文本(关闭、最大化、最小化、帮助),c#,winforms,winapi,tooltip,winforms-interop,C#,Winforms,Winapi,Tooltip,Winforms Interop,我一直在尝试更改窗体主标题栏上按钮的工具提示文本,但没有成功 简而言之,我们利用Windows窗体的“帮助”按钮来实现其他用途。这很好用。问题是,当鼠标悬停在该按钮上时,会出现“帮助”工具提示,这对应用程序没有任何意义 理想情况下,可以通过某种方式更改我的应用程序的工具提示文本;然而,在这一点上,只要找到一种完全禁用工具提示的方法,我就会感到满意 我知道你可以通过修改regedit中的“UserPreferencesMask”键来禁用整个操作系统的工具提示,但是我真的希望有一种方法可以让它只影响

我一直在尝试更改窗体主标题栏上按钮的工具提示文本,但没有成功

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

理想情况下,可以通过某种方式更改我的应用程序的工具提示文本;然而,在这一点上,只要找到一种完全禁用工具提示的方法,我就会感到满意

我知道你可以通过修改regedit中的“UserPreferencesMask”键来禁用整个操作系统的工具提示,但是我真的希望有一种方法可以让它只影响我的应用程序

同样,理想情况下,可以用托管代码实现这一点,但我不反对链接到WindowsAPI或类似的东西


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

作为一种解决方法,您可以不使用“帮助”按钮,而是:添加自定义按钮


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

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

在下面的示例代码中,我使用计时器不断搜索工具提示。这对性能不利,因此您可能希望确切地知道工具提示何时出现。在这种情况下,当工具提示与客户机控件关联时,可以简单地使用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;
程序TForm1.Timer1Timer(发送方:TObject);
变量
h:HWND;
开始
h:=FindWindow(无,“测试”);
如果h0那么
SendMessage(h,WM_CLOSE,0,0);
结束;
但是,当工具提示与标题栏按钮关联时,存在两个问题

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

  • 我当然建议避免改变标准系统设施的用途。我可以想象这会导致可访问性问题,特别是对于使用辅助软件的用户。这个解决方案并不能真正满足我的需要。我们使用第三方库(DevExpress)允许对WinForms组件进行蒙皮。在本例中绘制的按钮只是一个平面windows按钮。此外,它似乎有一些严重的闪烁问题和重画问题。您的共享示例应用程序在Windows 7操作系统中运行不完美,我的意思是它在Windows 7中消失。如果您有任何其他想法,请在此处共享它好吗?提前谢谢。