从仅限系统托盘的应用程序创建工具提示

所以我试图在屏幕上的某个点创建一个工具提示。

ToolTip tip = new ToolTip(); tip.Show("foobar", **IWin32Window window**, new Point(100, 100)) 

问题是我不知道在上面插入什么window参数。 我的应用程序完全从系统托盘中运行,并且没有其他GUI元素。 它叫做notifyIcon1 。 这是通过Form1创建的。 当插入tip.Show()时,这些值都不起作用。

如何仅使用系统托盘在屏幕上的任何位置生成工具提示?

谢谢。

IWin32Window接口是一个简单的接口,仅提供名为HandleIntPtr属性。 可能这样的事情应该有效:

 using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace SO_ToolTip { public partial class Form1 : Form { [DllImport("user32.dll")] public static extern IntPtr GetDesktopWindow(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { WindowWrapper windowWrapper = new WindowWrapper(GetDesktopWindow()); ToolTip toolTip = new ToolTip(); toolTip.Show("Blah blah... Blah blah... Blah blah...", windowWrapper, 1, 1, 10000); } } public class WindowWrapper : IWin32Window { public WindowWrapper(IntPtr handle) { Handle = handle; } public IntPtr Handle { get; protected set; } } } 

但事实并非如此。 它抱怨NullReferenceException并且我没有进一步调试。 这确实有效:

 ... private void button1_Click(object sender, EventArgs e) { ToolTip toolTip = new ToolTip(); toolTip.Show("Blah blah... Blah blah... Blah blah...", this, 1, 1, 10000); } ... 

虽然位置是相对于当前forms。 也许这会让你朝着正确的方向前进。

编辑:即使这不起作用,所以我不确定它是否是WindowWrapper的问题(如何?)或者什么:

 ... private void button1_Click(object sender, EventArgs e) { WindowWrapper windowWrapper = new WindowWrapper(this.Handle); ToolTip toolTip = new ToolTip(); toolTip.Show("Blah blah... Blah blah... Blah blah...", windowWrapper, 1, 1, 10000); } ... 

在这里,您可以在显示ToolTip之前使用BringToFront()的透明,最大化的表单

Form1代码:

 using System; using System.Windows.Forms; namespace SO_ToolTip { public partial class Form1 : Form { Random _Random = new Random(); ToolTip _ToolTip = new ToolTip(); public Form1() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { BringToFront(); _ToolTip.Show("Blah blah... Blah blah... Blah blah...", this, _Random.Next(0, Width), _Random.Next(0, Height), 10000); } } } 

Form1 Designer代码:您可以看到表单属性:

 namespace SO_ToolTip { partial class Form1 { ///  /// Required designer variable. ///  private System.ComponentModel.IContainer components = null; ///  /// Clean up any resources being used. ///  /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code ///  /// Required method for Designer support - do not modify /// the contents of this method with the code editor. ///  private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.timer1 = new System.Windows.Forms.Timer(this.components); this.SuspendLayout(); // // timer1 // this.timer1.Enabled = true; this.timer1.Interval = 1000; this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 264); this.ControlBox = false; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form1"; this.Opacity = 0; this.ShowIcon = false; this.ShowInTaskbar = false; this.WindowState = System.Windows.Forms.FormWindowState.Maximized; this.ResumeLayout(false); } #endregion private System.Windows.Forms.Timer timer1; } } 

加入晚会:

如果您喜欢/需要WPF窗口:

  private class ToolTipWPFWindow : Window { private readonly TextBlock m_txtToDisplay = new TextBlock(); private readonly DispatcherTimer m_timer = new DispatcherTimer(); public ToolTipWindow(string p_strStringToDisplay, int p_intXOnScreen = 0, int p_intYOnScreen = 0, double p_dblDurationInMilliSeconds = 1500) { if (p_intXOnScreen == 0 && p_intYOnScreen == 0) { p_intXOnScreen = System.Windows.Forms.Cursor.Position.X; p_intYOnScreen = System.Windows.Forms.Cursor.Position.Y; } m_txtToDisplay.Text = p_strStringToDisplay; m_txtToDisplay.Margin = new Thickness(3); Background = new SolidColorBrush(Colors.LightGoldenrodYellow); ShowInTaskbar = false; ResizeMode = System.Windows.ResizeMode.NoResize; Topmost = true; // Location on screen - As Set WindowStartupLocation = WindowStartupLocation.Manual; Left = p_intXOnScreen; Top = p_intYOnScreen; WindowStyle = WindowStyle.None; SizeToContent = SizeToContent.WidthAndHeight; Content = m_txtToDisplay; m_timer.Interval = TimeSpan.FromMilliseconds(p_dblDurationInMilliSeconds); m_timer.Tick += timer_Tick; m_timer.Start(); } private void timer_Tick(object sender, EventArgs e) { if (m_timer != null) { m_timer.Stop(); m_timer.Tick -= timer_Tick; } Close(); } 

用法:

 // Display the ToolTip Window to the right of the Cursor int intX = Cursor.Position.X + 20; int intY = Cursor.Position.Y; ToolTipWindow wpfWindow = new ToolTipWindow("Text To Display", intX, intY, 800); wpfWindow.Show(); 

结果:

wpf工具提示包含“要显示的文本”

我没有实现鼠标离开事件,因为我使用了短显示持续时间。