📄 vcc27.htm
字号:
<html>
<head>
<title>c++系列</title>
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
</head>
<p align="center"><script src="../../1.js"></script></a>
<body bgcolor="#ffffff" leftmargin="5" topmargin="1" marginheight="5" marginwidth="5">
<div align=center>
<table border=0 cellpadding=0 cellspacing=0 width=680 align="center">
<tbody>
<tr>
<td width=200 height="59">
</tr>
</tbody>
</table>
<table border=1 bordercolordark=#ffffff bordercolorlight=#ffffff cellpadding=0
cellspacing=0 width=685 align="center" height="70">
<tbody>
<tr>
<td bgcolor=#F9D23C height=14>
<div align=center class=H1> <b><strong> 从任务通知区启动屏幕保护程序</span></strong></b></font></div>
</td>
</tr>
<tr valign=top>
<td class=H1 height=212>
<p align="right"><font color="#FF0000"><strong> </span></strong>
作者:朱志强</span></font></font></p>
<p> 本文通过一个快速启动屏幕保护程序的小程序SSLaunch,来介绍应用程序如何向任务栏通知区加入图标、如何禁止多个Win32实例以及屏幕保护程序的有关内容。<br>
<br>
SSLaunch用C语言编写,用Visual C++ 5.0编译,是一个基于无模式对话框的程序,同时禁止多个实例,即一次只能有一个实例运行。任务栏通知区图标在对话框初始化时加入,对话框响应程序定义的回调消息,当鼠标左键按下时,弹出一由屏幕保护程序名填充的上下文菜单。对话框关闭(即程序退出)时删除任务栏通知区图标。如果读者有兴趣可以很容易地把它移植成基于
MFC 的程序。<br>
<br>
1、任务栏通知区<br>
<br>
Windows 95的任务栏中有一个通知区, 应用程序可以把一个图标放入其中,以表示操作状态,并可以有与之相关联的工具用作说明控制。当鼠标出现在此图标的矩形边界内时,向相应的应用程序发送应用程序定义的回调消息。应用程序通过发送消息增加、修改、删除任务栏图标。消息的发送通过调用函数Shell_NotifyIcon来完成,如果调用成功,则返回TRUE;否则,返回FALSE。Shell_NotifyIcon函数原形如下:<br>
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(<br>
DWORD dwMessage, // 消息标识符<br>
PNOTIFYICONDATA pnid // NOTIFYICONDATA 结构<br>
);<br>
消息标识符可以是 :<br>
NIM_ADD 向任务栏通知区加入图标<br>
NIM_DELETE 从任务栏通知区删除图标<br>
NIM_MODIFY 改变任务栏通知区图标<br>
NOTIFYICONDATA 结构:<br>
typedef struct _NOTIFYICONDATA {<br>
DWORD cbSize;<br>
HWND hWnd;<br>
UINT uID;<br>
UINT uFlags;<br>
UINT uCallbackMessage;<br>
HICON hIcon;<br>
char szTip[64];<br>
} NOTIFYICONDATA, *PNOTIFYICONDATA;<br>
其中:<br>
cbSize NOTIFYICONDATA 结构大小<br>
hWnd 接收回调消息窗口句柄<br>
uID 任务栏通知区图标标识<br>
uFlags 指定该结构中那些成员有效<br>
uCallbackMessage 应用程序定义的回调消息<br>
hIcon 任务栏通知区图标句柄<br>
szTip 任务栏通知区提示字符串<br>
参数uFlags可以是下列值的组合:<br>
NIF_ICON 任务栏通知区图标有效<br>
NIF_MESSAGE 应用程序定义的回调消息有效<br>
NIF_TIP 任务栏通知区提示字符串有效<br>
a.任务栏通知区图标的加入<br>
BOOL SSLaunch_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)<br>
<br>
{<br>
<br>
// Add an notification icon to the taskbar<br>
<br>
NOTIFYCONDATA nid;<br>
<br>
NOTIFYICONDATA nid;<br>
<br>
<br>
nid.cbSize = sizeof(nid);<br>
<br>
nid.hWnd = hwnd;<br>
<br>
nid.uID = IDI_SSLAUNCH;<br>
<br>
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;<br>
<br>
nid.uCallbackMessage = WM_SSLAUNCHICONNOTIFY;<br>
<br>
nid.hIcon=LoadIcon(GetWindowInstance(hwnd),<br>
<br>
KEINTRESOURCE(IDI_SSLAUNCH));<br>
<br>
lstrcpyn(nid.szTip,g_szAppName,sizeof(nid.szTip) /sizeof(nid.szTip[0]));<br>
<br>
<br>
return(Shell_NotifyIcon(NIM_ADD, &nid))<br>
<br>
}<br>
<br>
b.任务栏通知区图标的删除<br>
<br>
应用程序退出时,应该删除任务通知区上相应的图标:<br>
void SSLaunch_OnDestroy(HWND hwnd)<br>
<br>
{<br>
<br>
// Remove the notification icon from the taskbar<br>
<br>
<br>
NOTIFYICONDATA nid;<br>
<br>
nid.cbSize = sizeof(nid);<br>
<br>
nid.hWnd = hwnd;<br>
<br>
nid.uID = IDI_SSLAUNCH;<br>
<br>
<br>
Shell_NotifyIcon(NIM_DELETE, &nid);<br>
<br>
}<br>
<br>
c.应用程序定义回调消息的接收<br>
<br>
若为任务栏通知区指定了回调消息,则系统会于鼠标事件在此区域发生时<br>
<br>
向应用程序发送此消息,其中wParam是任务栏通知区图标标识,lParam<br>
<br>
是鼠标事件发生后的鼠标信息。<br>
<br>
<br>
void SSLaunch_OnIconNotify(WPARAM wParam, LPARAM lParam)<br>
<br>
{<br>
<br>
UINT uID = (UINT)wParam;<br>
<br>
UINT uMsg = (UINT)lParam;<br>
<br>
<br>
if(uID == IDI_SSLAUNCH){<br>
<br>
switch(uMsg){<br>
<br>
case WM_LBUTTONDOWN :<br>
<br>
//Do something<br>
<br>
break;<br>
<br>
<br>
case WM_LBUTTONUP :<br>
<br>
//Do something<br>
<br>
break;<br>
<br>
<br>
default :<br>
<br>
break;<br>
<br>
}<br>
<br>
}<br>
<br>
}<br>
<br>
<br>
2.禁止多个Win32实例<br>
<br>
在讨论禁止多个Win32实例之前,我们先讨论一下WinMain函数。我们知道,任何一个基于GDI的Windows程序以WinMain函数作为入口被系统调用。在Win16中,hPrevInstance指向前一个实例的句柄,但在Win32中,每一个进程都有一个独立的4G地址空间,从0到2G属于进程私有,对其他进程来说是不可见的。所以,在Win32中,hPrevInstance总是为NULL。<br>
<br>
<br>
int WINAPI WinMain(<br>
<br>
HINSTANCE hInstance, // handle to current instance<br>
<br>
HINSTANCE hPrevInstance, // handle to previous instance<br>
<br>
LPSTR lpCmdLine, // pointer to command line<br>
<br>
int nCmdShow // show state of window<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -