none
鼠标离开系统托盘 RRS feed

  • 问题

  • 请教问题如下:
    我的程序需要如下的功能:当程序最小化到系统托盘后,如果鼠标移动到系统托盘图标上时,打开一个窗口,显示信息,当鼠标离开系统托盘图标后,关闭打开的窗口。
    打开窗口我现在已经实现,具体的方法是设一全局变量,当鼠标移动到系统托盘图标上时,用notifyIcon1的MouseMove()事件打开窗口,并设置全局变量为T,打开的窗口里有一个timer1,每秒判断这个全局变量,如果为F则关闭窗口。
    如果鼠标离开系统托盘图标时,只需将全局变量修改为F,则已打开的窗口会检测到这个全局变量已经为F,将窗口关闭,现在的问题是我无法知道鼠标是否离开了系统托盘图标,没有找到对应的事件,请先达者解惑。谢谢。
    2009年10月31日 0:43

答案

  • 你好,这里使用个技巧就能达到效果。
    namespace WindowsFormsApplication6
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                form2 = new Form2();
            }
    
            private void notifyIcon1_MouseMove(object sender, MouseEventArgs e)
            {
                if (!form2.Visible)
                    form2.Show();
    
                // 记录当时的屏幕坐标
                this.lastPoint = System.Windows.Forms.Cursor.Position;
            }
    
            public Form2 form2;
            private Point lastPoint;
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                if (lastPoint == null) return;
    
                if (form2.Visible)
                {
                    // 判断最后一次 MouseMove 记录的屏幕坐标是否与当前的屏幕坐标
                    // 不相等就表示离开了。
                    if (lastPoint != System.Windows.Forms.Cursor.Position)
                        form2.Hide();
                }
            }
        }
    }




    知识改变命运,奋斗成就人生!
    • 已标记为答案 qiyao 2009年10月31日 6:15
    2009年10月31日 1:38
    版主
  • 你没有定义这两个东西嘛,你要多了解基础知识。

    Form4 DisplayDate;
    Point lastPoint;
    public Form1()
    {
        InitializeComponent();
        DisplayDate = new Form4();   // 这行程序是我增加的
    }
    
    private void notifyIcon1_MouseMove(object sender, MouseEventArgs e)
    {
        if (!DisplayDate.Visible)
            DisplayDate.Show();
    
        // 记录当时的屏幕坐标
        this.lastPoint = System.Windows.Forms.Cursor.Position;
    }




    知识改变命运,奋斗成就人生!
    • 已标记为答案 qiyao 2009年10月31日 6:15
    2009年10月31日 3:06
    版主
  • 你的DisplayDate定义成局部变量了,这样在方法外边是无法访问的,你定义成成员字段就好了:
    private Form4 DisplayDate=new Form4();
    Point lastPoint;
    public Form1()
    {
    InitializeComponent();

    }

    周雪峰
    • 已标记为答案 qiyao 2009年10月31日 6:15
    2009年10月31日 4:22
    版主

全部回复

  • 你好,这里使用个技巧就能达到效果。
    namespace WindowsFormsApplication6
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                form2 = new Form2();
            }
    
            private void notifyIcon1_MouseMove(object sender, MouseEventArgs e)
            {
                if (!form2.Visible)
                    form2.Show();
    
                // 记录当时的屏幕坐标
                this.lastPoint = System.Windows.Forms.Cursor.Position;
            }
    
            public Form2 form2;
            private Point lastPoint;
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                if (lastPoint == null) return;
    
                if (form2.Visible)
                {
                    // 判断最后一次 MouseMove 记录的屏幕坐标是否与当前的屏幕坐标
                    // 不相等就表示离开了。
                    if (lastPoint != System.Windows.Forms.Cursor.Position)
                        form2.Hide();
                }
            }
        }
    }




    知识改变命运,奋斗成就人生!
    • 已标记为答案 qiyao 2009年10月31日 6:15
    2009年10月31日 1:38
    版主
  • 谢谢您的回复。非常的感谢,我去试一下。
    2009年10月31日 2:34
  • 我试了下,有如下的错误提示:

    public Form1()
    {
           InitializeComponent();
           Form4 DisplayDate = new Form4();   // 这行程序是我增加的
    }

    private void notifyIcon1_MouseMove(object sender, MouseEventArgs e)
            {
                if (!DisplayDate.Visible)
                    DisplayDate.Show();

                // 记录当时的屏幕坐标
                this.lastPoint = System.Windows.Forms.Cursor.Position; }

    错误 1 当前上下文中不存在名称“DisplayDate” 
    错误 2 “TEST.Form1”不包含“lastPoint”的定义,并且找不到可接受类型为“TEST.Form1”的第一个参数的扩展方法“lastPoint”(是否缺少 using 指令或程序集引用?) 
    2009年10月31日 3:03
  • 你没有定义这两个东西嘛,你要多了解基础知识。

    Form4 DisplayDate;
    Point lastPoint;
    public Form1()
    {
        InitializeComponent();
        DisplayDate = new Form4();   // 这行程序是我增加的
    }
    
    private void notifyIcon1_MouseMove(object sender, MouseEventArgs e)
    {
        if (!DisplayDate.Visible)
            DisplayDate.Show();
    
        // 记录当时的屏幕坐标
        this.lastPoint = System.Windows.Forms.Cursor.Position;
    }




    知识改变命运,奋斗成就人生!
    • 已标记为答案 qiyao 2009年10月31日 6:15
    2009年10月31日 3:06
    版主
  • 我把 lastPoint 改成 Tag 现在这个错误没有了 ,错误 1 当前上下文中不存在名称“DisplayDate” 这个错误还存在
    2009年10月31日 3:07
  • 谢谢。我是才学C#的,才学了半个月,请别见笑。

    2009年10月31日 3:11
  • 你的DisplayDate定义成局部变量了,这样在方法外边是无法访问的,你定义成成员字段就好了:
    private Form4 DisplayDate=new Form4();
    Point lastPoint;
    public Form1()
    {
    InitializeComponent();

    }

    周雪峰
    • 已标记为答案 qiyao 2009年10月31日 6:15
    2009年10月31日 4:22
    版主
  • 谢谢楼上的回复。刚学习这个,还有很长的路要走,感觉要弄明白整个系统不是一件容易的事情,需要长时间的努力。

    2009年10月31日 4:26
  • 这个是我在网上找到的,可是不知道应该怎么用,方便回复下告诉我如何用吗?

    获取系统托盘某个图标的坐标区域,如果要隐藏某个图标例如音量的图标,也很方便,改改就可以了
          function GetSysTrayIconRect(Text: string): TRect;
          {
             返回系统托盘中指定文字的图标的矩形区域。
             例如返回音量控制图标的矩形区域:
             GetSysTrayIconRect('音量');
          }
          begin
             result := GetToolBarButtonRect(GetSysTrayWnd, Text);
          end;
    2009年10月31日 4:29