用SysTray控件,没有我可以发给你一个[email protected]
解决方案 »
- 怎么抓到Fn键???
- 大家认为activereport2.0的哪个版本比较稳定呀?我的sp1,编译时异常关闭,装上sp5就正常编译了。是不是有些版本不稳定呀?
- 最小化到托盘后无法响应mousemove事件
- VB程序访问串口失败 请各位帮我分析一下谢谢!!!!!!!!!!!
- UpdateBatch的使用
- (急急急)同一个teechart控件如何Import多个已Export的文件,并同时显示比对.
- 哪里有WindowsXP效果下的ListView控件?
- 向大家请教,我是否可以把accsee的数据库放在局域网中共其他机器调用?(局域网有域)
- 在vb内能实现对点阵字库的查找吗?
- 如何在程序里调出开始菜单里那个“运行”对话框?
- 如何把文件以二进制方式打开,并显示在文本框中?
- 急!如何设置DataGrid列的颜色?请高手帮忙。
SysTray控件,请E给我,谢谢!
Windows下许多程序都在系统托盘——屏幕右下角(Windows时间、输入法显示位置)显示程序图标,比如金山词霸、PC-cillin、SQL Server等,如何进行少量编程实现这一功能?WinApi提供了一个函数,帮助实现系统托盘图标的显示、删除、闪动等。在此,作者根据自己的实际经验提供在Visual Basic和Visual C++下的编程方法。
一、 WinApi的Shell_NotifyIcon函数介绍
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid);
参数说明:
DWORD dwMessage 有三个选择:
0——NIM_ADD 在系统托盘加上图标
1——NIM_DELETE 删除系统托盘上的图标
2——NIM_MODIFY 更换系统托盘上的图标
pnid是PNOTIFYICONDATA数据类型,包括
PNOTIFYICONDATA数据结构如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; //本数据结构的字节数
HWND hWnd; //图标所属的Windows程序窗口句柄
UINT uID;
UINT uFlags; //让图标变量NIF_ICON 、鼠标移动到图标处的事件变量 NIF_TIP、信息变量NIF_MESSAGE有效
UINT uCallbackMessage; //在图标位置的发生鼠标事件时向程序发送的消息
HICON hIcon; //图标指针
char szTip[64]; //当鼠标移动到图标位置时,自动显示的文字
} NOTIFYICONDATA, *PNOTIFYICONDATA;二、在Visual Basic下的使用方法
1、 声明
Option Explicit
Private Type NOTIFYICONDATA ' 定义NOTIFYICONDATA数据类型
cbSize As Long
hWnd As Long
uId As Long
uFlags As Long
ucallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type
' 定义对图标操作的常量
Private Const NIM_ADD = &H0 ' 增加图标
Private Const NIM_MODIFY = &H1 ' 改变图标
Private Const NIM_DELETE = &H2 ' 删除图标
' 以下定义鼠标事件常量
Private Const WM_MOUSEMOVE = &H200 ' 鼠标移动常量
Private Const WM_LBUTTONDBLCLK = &H203 ' 双击左鼠标按钮
Private Const WM_LBUTTONDOWN = &H201 ' 左鼠标按钮按下
Private Const WM_LBUTTONUP = &H202 ' 松开左鼠标按钮
Private Const WM_RBUTTONDBLCLK = &H206 ' 双击右鼠标按钮
Private Const WM_RBUTTONDOWN = &H204 ' 右鼠标按钮按下
Private Const WM_RBUTTONUP = &H205 ' 松开右鼠标按钮
Private Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4
' WinApi函数Shell_NotifyIcon声明
Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
' 定义NOTIFYICONDATA类型变量
Dim t As NOTIFYICONDATA
2、 方法
' 当程序运行时对变量t的赋值
Private Sub Form_Load()
t.cbSize = Len(t)
t.hwnd = Form1.hwnd
t.uId = 1&
t.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
t.ucallbackMessage = WM_MOUSEMOVE
't.ucallbackMessage = WM_LBUTTONUP
t.hIcon = Form1.Icon
t.szTip = "这是我的系统托盘程序"
End Sub
' 鼠标对图标操作事件的处理——体现在鼠标移动事件上
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single)
Dim msg As Long
Dim sFilter As String
msg = x / Screen.TwipsPerPixelX '鼠标按下时的按钮信息
Select Case msg
Case WM_LBUTTONDOWN ' 左鼠标按下事件
Me.Show ' 单击图标时显示程序窗口
Case WM_LBUTTONUP ' 左鼠标松开事件
Case WM_LBUTTONDBLCLK ' 左鼠标双击事件
Case WM_RBUTTONDOWN ' 右鼠标按下事件
Me.PopupMenu system ' 右鼠标按下时弹出菜单system是自定义的菜单
Case WM_RBUTTONUP ' 右鼠标松开事件
Case WM_RBUTTONDBLCLK ' 右鼠标双击事件
End Select
End Sub3、 改变图标
Shell_NotifyIcon NIM_DELETE, t
If t.hIcon = Form2.Icon Then t.hIcon = Form1.Icon Else t.hIcon = Form2.Icon
Shell_NotifyIcon NIM_ADD, t三、 在Visual C++下的使用方法
在Visual C++下实现时可以不用声明,直接使用函数
在窗口显示事件时赋值变量,并显示系统托盘图标
void ::OnShowWindow(BOOL bShow, UINT nStatus)
{
::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
if(nStatus){
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd =m_hWnd;
tnid.uID = 1;
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
//tnid.uCallbackMessage = MYWM_NOTIFYICON;
tnid.hIcon = m_hIcon;
strcpy(tnid.szTip, "这是我的第一个系统托盘程序!\0");
res = Shell_NotifyIcon(NIM_ADD, &tnid);
if (m_hIcon)
DestroyIcon(m_hIcon);
}
}
其他操作类似Visual Basic下的使用方法。