我注册了热键: Ctrl + Space 。热键消息发送到:
private void Hotkey_press()
{
... // I want to show tooltip "Hello" at current mouse location.
}
有没有办法显示这个工具提示,即使鼠标没有指向任何控件,它在我的Window.Form1之外?
编辑:工具提示甚至可以显示失去焦点或隐藏的表格
答案 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)
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
答案 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);
}