>>請問如何使程序最小化後將圖標置于系統欄中...>>100 >>請問如何使程序最小化後將圖標置于系統欄中...>>請各位高手出手,不勝感激!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看看我的程序吧!很简单的。其中的dll源代码就不用看了。ftp://pub:[email protected]/Hook和hotKey.rarftp://pub:[email protected]/Hook和hotKey源码.rar 不知道你说的是不是系统托盘区 如果是的话,建议你参看Shell_NotifyIcon函数 在运行开始时隐藏窗口,并将托盘放入,在登陆后,发送格消息给托盘,我想可以。下面是托盘的操作。其实这并不困难,与系统托盘通信的函数只有一个: Shell_NotifyIcon (UINT message, NOTIFYICONDATA &m_nid); 首先看一下该函数的两个参数。 第一个参数message可以取以下值: NIM_ADD 向托盘中加入一个图标; NIM_MODIFY 修改托盘中的图标NIM_DELETE 从托盘中删除一个图标 第二个参数m_nid是NOTIFYICONDATA结构的一个引用。该结构的原型如下: typedef struct _NOTIFYICONDATA { DWORD cbSize;// 结构的大小,必须在程序中给出 HWND hWnd; //是你程序中将要接收托盘消息的窗口句柄 UINT uID; // 应用程序中定义的托盘图标ID,此参数用作标识 UINT uFlags;//设置属性,低三位有意义,0--7,如下: //第一位//#define NIF_MESSAGE 0x1 // uCallbackMessage参数有效 //第二位//#define NIF_ICON 0x2 // hIcon参数有效 //第三位//#define NIF_TIP 0x4 // szTip参数有效 UINT uCallbackMessage; // 自定义的消息ID值,一定不要与以有的消息ID相重。 HICON hIcon; //显示在系统托盘上的Icon的句柄,可以为系统的 IDI_WINLOGO等 CHAR szTip[64]; // 用于图标显示的提示字符串} NOTIFYICONDATA; 为了接收到来自托盘的通知消息你可以将uCallbackMessage设定为你所定义的消息 ID值,同时设定NIF_MESSAGE标志。这样当用户在你的托盘图标上移动或按下鼠标 时,Windows将发出消息:该消息的 messageID是你在uCallbackMessage中定义的 值;wParam是你定义的uID值;而lParam是鼠标事件(如WM_LBUTTONDOWN),这样你 的应用程序就能响应该事件了。 因此,为了将自己的应用程序加入到系统托盘中,首先得建立一处理托盘通知消息 的窗口对象,然后将窗口对象与你自己的托盘通知消息联系起来并建立相应的托盘 通知消息映射机制,以便你的窗口对象能处理相应的事件。 可以看到结构体NOTIFYICONDATA中,其成员变量hWnd,uID,uFlags均用于在窗口对 象与你自己的托盘通知消息之间建立联系,而成员变量uCallbackMessage则必须是 对应于你的窗口对象的托盘通知消息ID值。 于是要完成的工作有: (1)建立一处理托盘通知消息的窗口对象; (2)建立一结构体NOTIFYICONDATA变量,并给变量的相应域赋值以在托盘通知消 息与窗口对象之间建立联系; (3)建立相应的托盘通知消息映射机制; (4)调用Shell_NotifyIcon函数以在系统托盘中加入、修改或删除图标; (5)当然别忘了在你的窗口对象中编写相应的事件响应函数。 因此,可以编写一C++类来实现以上功能以简化编程同时提高代码的可重用性。以 下为该类代码: class CTrayIcon : public CCmdTarget {protected: DECLARE_DYNAMIC(CTrayIcon) NOTIFYICONDATA m_nid; // Shell_NotifyIcon 函数中的结构参数public: CTrayIcon(UINT uID); ~CTrayIcon(); // 通过调用该成员函数来接收托盘通知消息 void SetNotificationWnd(CWnd* pNotifyWnd, UINT uCbMsg); // SetIcon 函数用来在系统托盘中加入、改变及删除图标。 //要删除图标这样调用:SetIcon(0) BOOL SetIcon(UINT uID); BOOL SetIcon(HICON hicon, LPCSTR lpTip); BOOL SetIcon(LPCTSTR lpResName, LPCSTR lpTip) { return SetIcon(lpResName ? AfxGetApp()->LoadIcon(lpResName):NULL,lpTip); } BOOL SetStandardIcon(LPCTSTR lpszIconName,LPCSTR lpTip) { return SetIcon(::LoadIcon(NULL,lpszIconName),lpTip); } virtual LRESULT OnTrayNotification(WPARAM uID, LPARAM lEvent);};CTrayIcon::CTrayIcon(UINT uID){ //初始化NOTIFYICONDATA结构变量 memset(&m_nid, 0 , sizeof(m_nid)); m_nid.cbSize = sizeof(m_nid); m_nid.uID = uID; AfxLoadString(uID, m_nid.szTip, sizeof (m_nid.szTip));}CTrayIcon::~CTrayIcon(){ SetIcon(0); // 从系统托盘中删除图标}// 设定通知窗口,该窗口必须已被创建void CTrayIcon::SetNotificationWnd(CWnd* pNotifyWnd, UINT uCbMsg){ ASSERT(pNotifyWnd==NULL || ::IsWindow(pNotifyWnd->GetSafeHwnd())); m_nid.hWnd = pNotifyWnd->GetSafeHwnd(); ASSERT(uCbMsg==0 || uCbMsg>=WM_USER); m_nid.uCallbackMessage = uCbMsg;}BOOL CTrayIcon::SetIcon(UINT uID){ HICON hicon=NULL; if (uID) { AfxLoadString(uID, m_nid.szTip, sizeof(m_nid.szTip)); hicon = AfxGetApp()->LoadIcon(uID); } return SetIcon(hicon, NULL);}////////////////////BOOL CTrayIcon::SetIcon(HICON hicon, LPCSTR lpTip) { UINT msg; m_nid.uFlags = 0; // 设定图标 if (hicon) { // 判断是要在系统托盘中增加还是要删除图标 msg = m_nid.hIcon ? NIM_MODIFY : NIM_ADD; m_nid.hIcon = hicon; m_nid.uFlags |= NIF_ICON; } else { // 删除图标 if (m_nid.hIcon==NULL) return TRUE; //已被删除 msg = NIM_DELETE; } if (lpTip) strncpy(m_nid.szTip, lpTip, sizeof(m_nid.szTip)); if (m_nid.szTip[0]) m_nid.uFlags |= NIF_TIP; if (m_nid.uCallbackMessage && m_nid.hWnd) m_nid.uFlags |= NIF_MESSAGE; BOOL bRet = Shell_NotifyIcon(msg, &m_nid); if (msg==NIM_DELETE || !bRet) m_nid.hIcon = NULL; return bRet;}// 缺省事件处理程序,该程序处理鼠标右击及双击事件。LRESULT CTrayIcon::OnTrayNotification(WPARAM wID, LPARAM lEvent){ if (wID!=m_nid.uID || (lEvent!=WM_RBUTTONUP && lEvent!=WM_LBUTTONDBLCLK)) return 0; // 使用与托盘图标拥有同样ID号的菜单作为右键弹出菜单 // 并将菜单上的第一项作为缺省命令使用, // 缺省命令在WM_LBUTTONDBLCLK事件发生时被击发 // CMenu menu; if (!menu.LoadMenu(m_nid.uID)) return 0; CMenu* pSubMenu = menu.GetSubMenu(0); if (!pSubMenu) return 0; if (lEvent==WM_RBUTTONUP) { //使菜单第一项为缺省项 (表现为粗体) ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE); // 在鼠标的当前位置弹出菜单。 CPoint mouse; GetCursorPos(&mouse); ::SetForegroundWindow(m_nid.hWnd); ::TrackPopupMenu(pSubMenu->m_hMenu, 0, mouse.x, mouse.y, 0, m_nid.hWnd, NULL); } else // 双击事件: 执行菜单第一项 ::SendMessage(m_nid.hWnd, WM_COMMAND, pSubMenu-> GetMenuItemID(0), 0); return 1; // 表示事件已被处理} VC 如何获取到内存信息,内存的参数! CTreeCtrl获取每个根节点文本 SNMP要获取CPU使用率信息? VC视频教程 关于学习VC++问题 CEdit用位图来改变背景、为什么只看见背景、看不见文字了? 想学编一些简单的vxd,如何入门? 请问这句话怎么解? 如何用CreateFont创建制定点大小的字符 关于TAPI的简单问题,大仙小仙们快救我! 点击工具栏中的某一按钮, 怎样使其保持按下状态? 使用"变量名=0"的方式却不能使编辑框中的值变为0,为什么?
很简单的。其中的dll源代码就不用看了。
ftp://pub:[email protected]/Hook和hotKey.rar
ftp://pub:[email protected]/Hook和hotKey源码.rar
如果是的话,建议你参看Shell_NotifyIcon函数
其实这并不困难,与系统托盘通信的函数只有一个: Shell_NotifyIcon (UINT message, NOTIFYICONDATA &m_nid); 首先看一下该函数的两个参数。
第一个参数message可以取以下值: NIM_ADD 向托盘中加入一个图标;
NIM_MODIFY 修改托盘中的图标
NIM_DELETE 从托盘中删除一个图标 第二个参数m_nid是NOTIFYICONDATA结构的一个引用。该结构的原型如下:
typedef struct _NOTIFYICONDATA
{
DWORD cbSize;// 结构的大小,必须在程序中给出
HWND hWnd;
//是你程序中将要接收托盘消息的窗口句柄
UINT uID;
// 应用程序中定义的托盘图标ID,此参数用作标识
UINT uFlags;
//设置属性,低三位有意义,0--7,如下:
//第一位//#define NIF_MESSAGE 0x1
// uCallbackMessage参数有效 //第二位//#define NIF_ICON 0x2 // hIcon参数有效
//第三位//#define NIF_TIP 0x4 // szTip参数有效
UINT uCallbackMessage;
// 自定义的消息ID值,一定不要与以有的消息ID相重。
HICON hIcon;
//显示在系统托盘上的Icon的句柄,可以为系统的 IDI_WINLOGO等
CHAR szTip[64]; // 用于图标显示的提示字符串
} NOTIFYICONDATA; 为了接收到来自托盘的通知消息你可以将uCallbackMessage设定为你所定义的消息
ID值,同时设定NIF_MESSAGE标志。这样当用户在你的托盘图标上移动或按下鼠标
时,Windows将发出消息:该消息的 messageID是你在uCallbackMessage中定义的
值;wParam是你定义的uID值;而lParam是鼠标事件(如WM_LBUTTONDOWN),这样你
的应用程序就能响应该事件了。
因此,为了将自己的应用程序加入到系统托盘中,首先得建立一处理托盘通知消息
的窗口对象,然后将窗口对象与你自己的托盘通知消息联系起来并建立相应的托盘
通知消息映射机制,以便你的窗口对象能处理相应的事件。 可以看到结构体NOTIFYICONDATA中,其成员变量hWnd,uID,uFlags均用于在窗口对
象与你自己的托盘通知消息之间建立联系,而成员变量uCallbackMessage则必须是
对应于你的窗口对象的托盘通知消息ID值。 于是要完成的工作有: (1)建立一处理托盘通知消息的窗口对象;
(2)建立一结构体NOTIFYICONDATA变量,并给变量的相应域赋值以在托盘通知消
息与窗口对象之间建立联系;
(3)建立相应的托盘通知消息映射机制;
(4)调用Shell_NotifyIcon函数以在系统托盘中加入、修改或删除图标;
(5)当然别忘了在你的窗口对象中编写相应的事件响应函数。 因此,可以编写一C++类来实现以上功能以简化编程同时提高代码的可重用性。以
下为该类代码: class CTrayIcon : public CCmdTarget {
protected:
DECLARE_DYNAMIC(CTrayIcon)
NOTIFYICONDATA m_nid;
// Shell_NotifyIcon 函数中的结构参数public:
CTrayIcon(UINT uID);
~CTrayIcon(); // 通过调用该成员函数来接收托盘通知消息
void SetNotificationWnd(CWnd* pNotifyWnd,
UINT uCbMsg); // SetIcon 函数用来在系统托盘中加入、改变及删除图标。
//要删除图标这样调用:SetIcon(0)
BOOL SetIcon(UINT uID);
BOOL SetIcon(HICON hicon, LPCSTR lpTip);
BOOL SetIcon(LPCTSTR lpResName, LPCSTR lpTip)
{
return SetIcon(lpResName ?
AfxGetApp()->LoadIcon(lpResName):NULL,lpTip);
}
BOOL SetStandardIcon(LPCTSTR lpszIconName,LPCSTR lpTip)
{
return SetIcon(::LoadIcon(NULL,lpszIconName),lpTip);
} virtual LRESULT OnTrayNotification(WPARAM uID, LPARAM lEvent);
};CTrayIcon::CTrayIcon(UINT uID)
{
//初始化NOTIFYICONDATA结构变量
memset(&m_nid, 0 , sizeof(m_nid));
m_nid.cbSize = sizeof(m_nid);
m_nid.uID = uID;
AfxLoadString(uID, m_nid.szTip, sizeof
(m_nid.szTip));
}CTrayIcon::~CTrayIcon()
{
SetIcon(0); // 从系统托盘中删除图标
}// 设定通知窗口,该窗口必须已被创建
void CTrayIcon::SetNotificationWnd(CWnd* pNotifyWnd, UINT uCbMsg)
{
ASSERT(pNotifyWnd==NULL || ::IsWindow(pNotifyWnd->GetSafeHwnd())); m_nid.hWnd = pNotifyWnd->GetSafeHwnd(); ASSERT(uCbMsg==0 || uCbMsg>=WM_USER);
m_nid.uCallbackMessage = uCbMsg;
}BOOL CTrayIcon::SetIcon(UINT uID)
{
HICON hicon=NULL;
if (uID) {
AfxLoadString(uID, m_nid.szTip, sizeof(m_nid.szTip));
hicon = AfxGetApp()->LoadIcon(uID);
}
return SetIcon(hicon, NULL);
}//////////////////
//
BOOL CTrayIcon::SetIcon(HICON hicon, LPCSTR lpTip)
{
UINT msg;
m_nid.uFlags = 0; // 设定图标
if (hicon) {
// 判断是要在系统托盘中增加还是要删除图标
msg = m_nid.hIcon ? NIM_MODIFY : NIM_ADD;
m_nid.hIcon = hicon;
m_nid.uFlags |= NIF_ICON;
} else { // 删除图标
if (m_nid.hIcon==NULL)
return TRUE; //已被删除
msg = NIM_DELETE;
}
if (lpTip)
strncpy(m_nid.szTip, lpTip, sizeof(m_nid.szTip));
if (m_nid.szTip[0])
m_nid.uFlags |= NIF_TIP; if (m_nid.uCallbackMessage && m_nid.hWnd)
m_nid.uFlags |= NIF_MESSAGE; BOOL bRet = Shell_NotifyIcon(msg, &m_nid);
if (msg==NIM_DELETE || !bRet)
m_nid.hIcon = NULL;
return bRet;
}// 缺省事件处理程序,该程序处理鼠标右击及双击事件。
LRESULT CTrayIcon::OnTrayNotification(WPARAM wID,
LPARAM lEvent)
{
if (wID!=m_nid.uID ||
(lEvent!=WM_RBUTTONUP && lEvent!=WM_LBUTTONDBLCLK))
return 0; // 使用与托盘图标拥有同样ID号的菜单作为右键弹出菜单
// 并将菜单上的第一项作为缺省命令使用,
// 缺省命令在WM_LBUTTONDBLCLK事件发生时被击发
//
CMenu menu;
if (!menu.LoadMenu(m_nid.uID))
return 0;
CMenu* pSubMenu = menu.GetSubMenu(0);
if (!pSubMenu)
return 0; if (lEvent==WM_RBUTTONUP) { //使菜单第一项为缺省项 (表现为粗体)
::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE); // 在鼠标的当前位置弹出菜单。
CPoint mouse;
GetCursorPos(&mouse);
::SetForegroundWindow(m_nid.hWnd);
::TrackPopupMenu(pSubMenu->m_hMenu,
0,
mouse.x,
mouse.y,
0,
m_nid.hWnd,
NULL); } else // 双击事件: 执行菜单第一项
::SendMessage(m_nid.hWnd, WM_COMMAND, pSubMenu->
GetMenuItemID(0), 0); return 1; // 表示事件已被处理
}