请高手帮忙:如何将程序最小化成小图标 在屏幕右下角缩成图标用Shell_NotifyIcon;快捷键用RegisterHotKey和UnRegisterHotKey; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Shell_NotifyIcon()第一个参数NIM_ADD新建一个任务栏图标NIM_MODIFY修改.........NIM_DELETE删除.........第二个参数NOTIFYICONDATA结构详细的看msdn吧 使用VC和VB对系统托盘编程的方法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 ExplicitPrivate Type NOTIFYICONDATA ' 定义NOTIFYICONDATA数据类型 cbSize As Long hWnd As Long uId As Long uFlags As Long ucallbackMessage As Long hIcon As Long szTip As String * 64End 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 = &H1Private Const NIF_ICON = &H2Private 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 NOTIFYICONDATA2、 方法' 当程序运行时对变量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 SelectEnd Sub3、 改变图标 Shell_NotifyIcon NIM_DELETE, t If t.hIcon = Form2.Icon Then t.hIcon = Form1.Icon Else t.hIcon = Form2.IconShell_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下的使用方法。 如何防止DLL被非法调用? 急急急!!!socket通信中,如何让server端的数据调取和处理工作同时进行?? 如何重绘无标题栏对话框标题栏 Red Hat linux的虚拟机和windows的主机怎么共享文件? tcp中请问如何强制发送数据 BUG: WTL7及WTL7.1中的资源泄露 .cpp文件里可以用.h里的各个函数吗?包括private protected的? 有办法让dll自己运行代码?而不是用函数调用的形式 具体怎样实现ip攻击的? 编译的问题 请教怎样给分! CAnimateCtrl::Open打不开.avi文件,可能因为啥?
第一个参数
NIM_ADD新建一个任务栏图标
NIM_MODIFY修改.........
NIM_DELETE删除.........
第二个参数
NOTIFYICONDATA结构
详细的看msdn吧
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下的使用方法。