📄 systemtray.cpp
字号:
//=============================================================================================
/*
文件: SystemTray.cpp
说明:
---------------------------------------------------
在系统任务栏上显示图标。
---------------------------------------------------
工程: Xfilter 个人防火墙
作者: 朱雁辉,朱雁冰
创建日期: 2001/08/12
网址: http://www.xfilt.com
电子邮件: xstudio@xfilt.com
版权所有 (c) 2001-2002 X 工作室
警告:
---------------------------------------------------
本电脑程序受著作权法的保护。未经授权,不能使用
和修改本软件全部或部分源代码。凡擅自复制、盗用或散
布此程序或部分程序或者有其它任何越权行为,将遭到民
事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。
凡通过合法途径购买本软件源代码的用户被默认授权
可以在自己的程序中使用本软件的部分代码,但作者不对
代码产生的任何后果负责。
使用了本软件代码的程序只能以可执行文件形式发布,
未经特别许可,不能将含有本软件源代码的源程序以任何
形式发布。
---------------------------------------------------
*/
//=============================================================================================
#include "stdafx.h"
#include "SystemTray.h"
CSystemTray::CSystemTray()
{
Initialise();
}
CSystemTray::CSystemTray(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szToolTip,
HICON icon, UINT uID)
{
Initialise();
Create(pParent, uCallbackMessage, szToolTip, icon, uID);
}
void CSystemTray::Initialise()
{
memset(&m_tnd, 0, sizeof(m_tnd));
m_bEnabled = FALSE;
m_bHidden = FALSE;
m_DefaultMenuItemID = 0;
m_DefaultMenuItemByPos = TRUE;
}
BOOL CSystemTray::Create(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szToolTip,
HICON icon, UINT uID)
{
m_bEnabled = (GetVersion() & 0xff) >= 4;
if (!m_bEnabled)
{
ASSERT(FALSE);
return FALSE;
}
ASSERT(uCallbackMessage >= WM_USER);
ASSERT(_tcslen(szToolTip) <= 64);
m_tnd.cbSize = sizeof(NOTIFYICONDATA);
m_tnd.hWnd = pParent->GetSafeHwnd();
m_tnd.uID = uID;
m_tnd.hIcon = icon;
m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
m_tnd.uCallbackMessage = uCallbackMessage;
_tcscpy(m_tnd.szTip, szToolTip);
m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd);
ASSERT(m_bEnabled);
return m_bEnabled;
}
CSystemTray::~CSystemTray()
{
RemoveIcon();
}
void CSystemTray::RemoveIcon()
{
if (!m_bEnabled) return;
m_tnd.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE, &m_tnd);
m_bEnabled = FALSE;
}
void CSystemTray::HideIcon()
{
if (m_bEnabled && !m_bHidden) {
m_tnd.uFlags = NIF_ICON;
Shell_NotifyIcon (NIM_DELETE, &m_tnd);
m_bHidden = TRUE;
}
}
BOOL CSystemTray::SetIcon(UINT nIDResource)
{
HICON hIcon = AfxGetApp()->LoadIcon(nIDResource);
if (!m_bEnabled) return FALSE;
m_tnd.uFlags = NIF_ICON;
m_tnd.hIcon = hIcon;
return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
}
BOOL CSystemTray::SetMenuDefaultItem(UINT uItem, BOOL bByPos)
{
if ((m_DefaultMenuItemID == uItem) && (m_DefaultMenuItemByPos == bByPos))
return TRUE;
m_DefaultMenuItemID = uItem;
m_DefaultMenuItemByPos = bByPos;
CMenu menu, *pSubMenu;
if (!menu.LoadMenu(m_tnd.uID))
return FALSE;
pSubMenu = menu.GetSubMenu(0);
if (!pSubMenu)
return FALSE;
::SetMenuDefaultItem(pSubMenu->m_hMenu, m_DefaultMenuItemID, m_DefaultMenuItemByPos);
return TRUE;
}
LRESULT CSystemTray::OnTrayNotification(UINT wParam, LONG lParam)
{
if (wParam != m_tnd.uID)
return 0;
CMenu menu, *pSubMenu;
CWnd* pTarget = AfxGetMainWnd();
static BOOL IsShowed = FALSE;
if (LOWORD(lParam) == WM_RBUTTONUP)
{
if (!menu.LoadMenu(m_tnd.uID))
return 0;
pSubMenu = menu.GetSubMenu(0);
if (!pSubMenu)
return 0;
::SetMenuDefaultItem(pSubMenu->m_hMenu, m_DefaultMenuItemID, m_DefaultMenuItemByPos);
CPoint pos;
GetCursorPos(&pos);
pTarget->SetForegroundWindow();
IsShowed = TRUE;
::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0,
pTarget->GetSafeHwnd(), NULL);
IsShowed = FALSE;
pTarget->PostMessage(WM_NULL, 0, 0);
menu.DestroyMenu();
}
else if (LOWORD(lParam) == WM_LBUTTONDBLCLK)
{
if(IsShowed)
return 0;
pTarget->SetForegroundWindow();
UINT uItem;
if (m_DefaultMenuItemByPos)
{
if (!menu.LoadMenu(m_tnd.uID))
return 0;
pSubMenu = menu.GetSubMenu(0);
if (!pSubMenu)
return 0;
uItem = pSubMenu->GetMenuItemID(m_DefaultMenuItemID);
}
else
uItem = m_DefaultMenuItemID;
pTarget->SendMessage(WM_COMMAND, uItem, 0);
menu.DestroyMenu();
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -