如何在当前鼠标位置设置工具提示?

时间:2012-08-09 14:34:28

标签: c# winforms tooltip

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

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

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

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

5 个答案:

答案 0 :(得分:8)

你想要像

这样的东西
ToolTip tt = new ToolTip();
IWin32Window win = this;
tt.Show("String", win, mousePosition);

可以从MousePosition通过

获取MouseEventArgs的位置
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秒。

我希望这会有所帮助。

答案 1 :(得分:3)

答案 2 :(得分:2)

this answer所示,没有可行的方法来实现这一目标。如果您想在程序未对焦时显示工具提示控件,那么“正确”的方法是使用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个对象。

答案 3 :(得分: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");
        }

答案 4 :(得分:0)

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

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

第二个参数可以是任何控件,但使用包含工具提示本身的控件(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);
        }