3

我注册了热键:Ctrl+ Space。热键消息发送到:

private void Hotkey_press()
{
... // I want to show tooltip "Hello" at current mouse location.
}

有没有办法显示这个工具提示,即使鼠标没有指向任何控件并且它在我的 Window.Form1 之外?

编辑:该工具提示甚至可以显示失去焦点或隐藏的表单

4

5 回答 5

11

你想要类似的东西

ToolTip tt = new ToolTip();
IWin32Window win = this;
tt.Show("String", win, mousePosition);

从哪里MousePosition可以得到MouseEventArgsvia

private SomeMouseEventHandler(object sender, MouseEventArgs e)
{
    System.Drawing.Point mousePosition = e.Location;
    ...
}

或使用

System.Drawing.Point mousePosition = Cursor.Position;

此外,您可能希望设置更长的ToolTip显示持续时间,只需使用该Show方法可用的重载,tt.Show("String", win, mousePosition, 5000);将显示工具提示 5 秒。

我希望这有帮助。

于 2012-08-09T14:43:10.007 回答
3
Tooltip tip = new ToolTip();
tip.ShowAlways = true;
tip.Show("My tooltip",this,Cursor.Position.X,Cursor.Position.Y);

http://msdn.microsoft.com/en-us/library/system.windows.forms.tooltip.aspx

http://msdn.microsoft.com/en-us/library/system.windows.forms.tooltip.showalways.aspx

http://msdn.microsoft.com/en-us/library/system.windows.forms.cursor.aspx

于 2012-08-09T14:45:16.460 回答
2

正如这个答案所暗示的,没有管理的方法来实现这一点。如果您想在程序未聚焦时显示工具提示控件,那么“正确”的方法是 PInvoke Win32 并使用CreateWindowEx. gideon给出的上面链接的答案显示了一些关于如何做到这一点的指示,但它仍然非常复杂。

如果您不介意使用第三方库,AutoIt提供了一种轻松创建工具提示的方法,而无需自己处理 Win32。

这是一个非常简单的示例,演示使用:

//make sure AutoItX3.dll is referenced in your project
using AutoItX3Lib;

private AutoItX3 myAutoIt = new AutoItX3();

private async void ShowToolTipAtMouse(string message)
{
    //default position is bottom right of mouse pointer,
    //but you can set the x and y positions yourself
    myAutoIt.ToolTip(message);

    //call the function again with an empty argument to close
    await Task.Delay(1000);
    myAutoIt.ToolTip(String.Empty);
}

只要您的程序正在运行,这将起作用;不管它是在焦点内/焦点外,甚至是隐藏的。缺点是你没有得到常规的淡出动画(它只是消失了)。此外,如果您一次需要多个工具提示,则需要拥有多个AutoItX3对象。

于 2015-03-12T21:21:11.560 回答
0

您需要在鼠标事件中显示/隐藏它,还将鼠标位置从屏幕坐标转换为您的控制坐标。小问题是,如果您将工具提示完全放在鼠标指针位置上,则工具提示将捕获 mouseEnter 事件,并且您的控件上的意外 mouseLeave 事件将被触发,因此我的解决方案是在最终位置添加一点偏移量。

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            Point p = pictureBox3.PointToClient(Cursor.Position);
            p.X += 5;
            p.Y += 5;
            toolTip1.Show("My tooltip" ,
                pictureBox1, p);

        }


        private void pictureBox1_MouseLeave(object sender, EventArgs e)
        {
            toolTip1.ShowAlways = false;
            Text = ("Leave");
        }

        private void pictureBox1_MouseEnter(object sender, EventArgs e)
        {
            toolTip1.ShowAlways = true;
            Text=("Enter");
        }
于 2020-10-27T18:14:44.833 回答
0

遗憾的是 Winforms 没有工具提示的位置属性。

我发现最简单的方法是添加您自己的鼠标悬停和鼠标离开处理程序,然后使用 Show() 函数设置位置(x 和 y),以像素为单位,相对于第二个参数的左上角显示()函数。

第二个参数可以是任何控件,但使用包含工具提示本身 (this) 的控件、控件的父控件或控件内的子控件可能最有意义。

您可以使用 Point 而不是两个参数(x 和 y)作为位置,但请记住 Show() 将采用该点的 x 坐标和 y 坐标并将它们添加到您的控件左上角的 x 和 y 坐标选择作为第二个参数。

        private void UserControl1_MouseHover(object sender, EventArgs e)
        {
            toolTip1.Show("this text is so new", this, 10, 10);
        }

        private void UserControl1_MouseLeave(object sender, EventArgs e)
        {
            toolTip1.Hide(this);
        }
于 2021-05-07T17:48:51.043 回答