【问题标题】:Override tooltip text for Titlebar buttons (Close, Maximize, Minimize, Help)覆盖标题栏按钮的工具提示文本(关闭、最大化、最小化、帮助)
【发布时间】:2011-02-02 16:30:42
【问题描述】:

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

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

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

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

同样,理想情况下,有一些方法可以使用托管代码执行此操作,但我不反对链接到 Windows API 等。

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

【问题讨论】:

    标签: c# winforms winapi tooltip winforms-interop


    【解决方案1】:

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

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

    【讨论】:

    • 我当然建议避免更改标准系统设施的用途。我可以想象这会导致可访问性问题,特别是对于使用辅助软件的用户。
    • 这个解决方案并不能真正满足我的需求。我们使用第 3 方库 (DevExpress) 来允许 WinForms 组件的皮肤。在这种情况下绘制的按钮只是一个平面窗口按钮。此外,它似乎有一些糟糕的闪烁问题和重绘问题。
    • 您共享的示例应用程序在 Windows 7 操作系统中运行不完美,我的意思是它在 Windows 7 中消失了,如果您有任何其他想法,可以在这里分享吗?提前致谢。
    【解决方案2】:

    这是一个非常有趣的问题。我的第一个想法是使用 GetSysMenu 更改系统菜单。我尝试删除和重命名“关闭”项目,但关闭按钮的工具提示没有改变。然后我尝试捕获工具提示窗口的HWND,但没有成功。如果我让表单(我在 Delphi 中工作)显示一个名为“Test”的工具提示,我可以通过 FindWindow(nil, 'Test') 获取它的 HWND,然后我可以向它发送消息 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* 消息来推断何时显示标题栏工具提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2012-06-23
      • 2012-02-20
      • 2016-03-04
      • 2016-10-04
      • 2011-05-29
      相关资源
      最近更新 更多