积极答复者
如何获取系统托盘某个图标的坐标区域

问题
-
这个是我在网上找到的,用关键字 获取系统托盘区图标的坐标 在谷歌里查到的,可是不知道应该怎么用,看前后文应该是用Delphi写的,在C#中如何实现这个功能?
获取系统托盘某个图标的坐标区域,如果要隐藏某个图标例如音量的图标,也很方便,改改就可以了
function GetSysTrayIconRect(Text: string): TRect;
{
返回系统托盘中指定文字的图标的矩形区域。
例如返回音量控制图标的矩形区域:
GetSysTrayIconRect('音量');
}
begin
result := GetToolBarButtonRect(GetSysTrayWnd, Text);
end;- 已移动 Sheng Jiang 蒋晟Moderator 2009年11月3日 2:23 Windows表单类库问题 (发件人:Visual C#)
答案
全部回复
-
X.X.Y 您好。前面的帖子,您帮助我解决了一个问题,就是获得鼠标当前坐标的问题,但是,您的方案我感觉有些问题,现描述如下:
notifyIcon1_MouseMove()方法中将当前鼠标的坐标值保存在lastPoint中,只要鼠标在系统托盘图标范围内移动,则lastPoint中的值就会一直更新;
timer1_Tick()方法中用当前鼠标的坐标值和lastPoint中的值进行比较,如果不同则判断为鼠标离开了
这个方法有个必要条件,那就是notifyIcon1_MouseMove()方法必须在timer1_Tick()方法先执行,可是,我找了半天也没有找到两个方法那个会先执行的说明
怕如果出现下面的情况:如果正在执行timer1_Tick()方法的时候,我动了鼠标,那timer1_Tick()方法中得到的鼠标坐标值一定和保存原来坐标值的lastPoint中的内容不同,因为notifyIcon1_MouseMove()还没有更新lastPoint中的内容,则会造成错误的判断。
正好在网上又找到了我前面发的那段程序,想如果能知道系统托盘中图标的范围,则一定不会出现错误判断的情况,所以又才发了这个帖子。
呵呵,因为我是搞单片机的,对程序的稳定性习惯性地想多了些,如果不当,也请你原谅。 -
现在程序的设计是想当程序最小化到系统托盘后,如果鼠标移动到系统托盘的该程序的图标上,就显示一个新窗口,新窗口里的数据按等时间间隔进行刷新。
通过notifyIcon1_MouseMove()方法可以打开新的窗口,可是,如果鼠标还在系统托盘的图标上移动,就不能关闭窗口,必须等鼠标移出这个范围后才能关闭,否则会出现的情况是
鼠标在图标范围内一移动,新窗口就关闭了,因为新窗口是判断鼠标是否移动的,鼠标动一个像素,都会使新窗口关闭了,而用户怎么可能把鼠标定位在触发notifyIcon1_MouseMove()方法就立刻停住鼠标呢?
一定有惯性的,有的鼠标很灵敏,不动鼠标,像素点都会晃动呢。感觉楼上的方法不可行呢。 -
刚回复完,就想到了一个方法:
设置一个全局变量A,默认为空
notifyIcon1_MouseMove()方法打开新窗口后,延时秒0.5后把当前的鼠标坐标赋值给lastPoint(假设用户肯定会在0.5秒内停住鼠标不动)
Timer方法正常更新数据,当全局变量A不等于空后再判断鼠标的坐标并且和lastPoint中的值进行比较,如果不同,就关闭窗口。
这个方法应该是个变通的方法。如果能得到图标的范围进行判断是最好的,可是,我刚才去看了MSDN中的System.Windows.Forms.ToolBar的资料
我的水平太低了,只能看懂方法和属性两种图标的意思,知道这些是表示方法和属性,其他很多图标都看不懂,连那些图标表示什么意思都不明白。路还很长很长。
请X.X.Y和周雪峰两位先生看下这个方法是否可行? -
呵呵,我只是个初学者,学这个才半个月,只能向你们学习呢。
程序的设计是程序有一个主窗口,在主窗口里可以进行各种设置,当主窗口最小化到系统托盘后,如果鼠标移动到系统托盘的该程序的图标上,就显示一个提示窗口,提示窗口里的数据按等时间间隔进行刷新(实时数据,目前定为间隔1秒)。
通过notifyIcon1_MouseMove()方法可以打开提示窗口,问题的关键是如何知道鼠标离开了系统托盘里的图标.
现在的解决方法是
notifyIcon1_MouseMove()方法里打开新窗口,并且开始比较鼠标的坐标,如果鼠标的坐标不变了,则将鼠标的坐标保存在一个全局变量中,并且将鼠标状态标志位置位
提示窗口里的Timer方法正常显示数据的同时,检测鼠标状态标志位,如果鼠标状态标志位置位,则表示鼠标已经停住了,就比较当前的鼠标坐标和已经保存的鼠标坐标,如果两者不同,则表示鼠标又已经移动了,就关闭提示窗口,将鼠标状态标志位复位。一次操作完成。
不知道我描述的是否清楚。