检测提示框是否显示?

8
我正在使用show方法手动在控件上显示System.Windows.Forms.Tooltip,但是如何检测是否当前正在显示提示信息?
如果需要更改显示方法以便找出答案,那也可以。

如果您正在使用 .Net 3.0 或 3.5,则有一个名为 IsOpen 的标志可用。对于 2.0 框架,我猜 ToolTip.Active 会有所帮助。不过我不确定。 - danish
IsOpen 只是 WPF 工具提示上的一个属性,而不是 WinForms 工具提示上的。 - Xilconic
ToolTip.Active属性与ToolTip是否显示无关。它会保持您的代码设置的状态,直到您的代码对其进行更改。 - Jesse Chisholm
3个回答

9
你可以尝试使用ToolTip.GetToolTip(control)方法,并检查返回的值是否为空字符串,代码如下:
if (!string.IsNullOrEmpty(myToolTip.GetToolTip(myControl)))
{
    // 成功!
}

3
GetToolTip(在winforms中测试)仅检查是否为该Control调用了SetToolTip方法;如果是,则返回文本,无论工具提示是否显示。据我所见,GetToolTip的返回值与是否调用了Show之间没有关系。 - Xilconic
10
这个被接受的答案完全是错误的。它并没有告诉你 ToolTip 当前是否正在显示,它只获取了控件的 ToolTip 文本值。 - Scott Baker

3

我曾经遇到了内置工具提示的许多问题,因此我使用计时器和跟踪鼠标移动来构建了自己的工具提示。


1
如果这是唯一可能显示的工具提示,请使用Tommy的解决方案。
如果有超出您控制范围的工具提示,您可以枚举所有工具提示窗口并检查其中是否有一个:
a) 显示
b) 在您的表单/应用程序边界内
类似于这样:
Native.EnumWindows ew = new Native.EnumWindows();
ew.GetWindows();


foreach (EnumWindowsItem item in ew.Items)
{
    //find all windows forms tooltips currently visible
    if (item.ClassName.StartsWith("WindowsForms10.tooltips_class32") && item.Visible)
    {
        //check if tooltip is on within form bounds
        if (item.Location.X >= this.Location.X && item.Location.Y >= this.Location.Y && 
            item.Location.X <= this.Location.X + this.Width &&
            item.Location.Y <= this.Location.Y + this.Height)
        {
            //Tooltip currently shown within form bounds
        }
    }

}

使用这段代码来进行EnumWindows互操作包装。这有点像黑客技巧,如果Tommy的解决方案适用于您,那就好多了


这个算法看起来非常有用,但是 EnumWindows 包装器的链接已经失效了。到目前为止,在我的互联网搜索中还没有找到它。如果有人知道在哪里获取这段代码,请发布它或至少提供一个更新的链接? - Charles Jenkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接