我注册了热键:Ctrl+ Space。热键消息发送到:
private void Hotkey_press()
{
... // I want to show tooltip "Hello" at current mouse location.
}
有没有办法显示这个工具提示,即使鼠标没有指向任何控件并且它在我的 Window.Form1 之外?
编辑:该工具提示甚至可以显示失去焦点或隐藏的表单
你想要类似的东西
ToolTip tt = new ToolTip();
IWin32Window win = this;
tt.Show("String", win, mousePosition);
从哪里MousePosition
可以得到MouseEventArgs
via
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 秒。
我希望这有帮助。
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
正如这个答案所暗示的,没有管理的方法来实现这一点。如果您想在程序未聚焦时显示工具提示控件,那么“正确”的方法是 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
对象。
您需要在鼠标事件中显示/隐藏它,还将鼠标位置从屏幕坐标转换为您的控制坐标。小问题是,如果您将工具提示完全放在鼠标指针位置上,则工具提示将捕获 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");
}
遗憾的是 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);
}