Windows 7 的网络活动指示器






4.86/5 (57投票s)
在 Windows 7 的系统托盘上显示旧的“双显示器”图标,该图标会闪烁蓝色以显示网络活动。

引言
在 Windows XP 中,我习惯于启用“连接时在通知区域显示图标”,Windows 会显示一个闪烁的图标来指示系统托盘上的网络流量。
在 Windows 7 中,我只能获得一个静态图标来显示我已连接到网络,没有动画来显示流量。
我发现动画功能已被从 Windows 7 中移除,所以我决定创建一个简单的应用程序来满足那些(包括我自己)想要查看网络进出数据的人们。
很久以前,我开发了一个名为 Network Lights 的小工具,它会闪烁键盘 LED(发光二极管),指示网络接口上的传入和传出网络数据包。该工具及其源代码可以在这里找到:www.itsamples.com/network-lights.html。我将其重新制作以控制系统托盘图标而不是键盘 LED,并将其适配到 Windows 7 环境。
Using the Code
该程序的核心是一个单独的线程,它获取当前的 TCP、UDP 和 ICMP 统计信息,并决定应在系统托盘上显示哪个图标。
void TCPThread(LPVOID pInfo)
{
MIB_TCPSTATS mibTcpStats;
MIB_UDPSTATS mibUdpStats;
MIB_ICMP mibIcmpStats;
UINT nCounter = 0;
DWORD dwSegTcpRcvd = 0;
DWORD dwSegTcpSent = 0;
DWORD dwSegUdpRcvd = 0;
DWORD dwSegUdpSent = 0;
DWORD dwSegIcmpRcvd = 0;
DWORD dwSegIcmpSent = 0;
DWORD dwLocalOutSegs = 0;
DWORD dwLocalInSegs = 0;
while(m_bWorkContinue)
{
if(m_bSetIconContinue)
{
m_dwPacketsSent = 0;
m_dwPacketsReceived = 0;
m_bSetIconContinue = FALSE;
if(m_bDisplayTCP)
{
if(GetTcpStatistics(&mibTcpStats) == NO_ERROR)
{
dwLocalInSegs = mibTcpStats.dwInSegs;
dwLocalOutSegs = mibTcpStats.dwOutSegs;
m_dwPacketsSent += dwLocalOutSegs;
m_dwPacketsReceived += dwLocalInSegs;
if(dwLocalOutSegs > dwSegTcpSent &&
dwLocalInSegs > dwSegTcpRcvd)
{
dwSegTcpSent = dwLocalOutSegs;
dwSegTcpRcvd = dwLocalInSegs;
SetTrayIcon(NIM_MODIFY,
m_hActiveIcon);
goto done;
}
else if(dwLocalOutSegs > dwSegTcpSent &&
dwLocalInSegs <= dwSegTcpRcvd)
{
dwSegTcpSent = dwLocalOutSegs;
SetTrayIcon
(NIM_MODIFY, m_hSendIcon);
goto done;
}
else if(dwLocalInSegs > dwSegTcpRcvd &&
dwLocalOutSegs <= dwSegTcpSent)
{
dwSegTcpRcvd = dwLocalInSegs;
SetTrayIcon(NIM_MODIFY,
m_hReceiveIcon);
goto done;
}
else
nCounter++;
if(nCounter == 10)
{
nCounter = 0;
SetTrayIcon(NIM_MODIFY,
m_hInactiveIcon);
goto done;
}
}
}
if(m_bDisplayUDP)
{
if(GetUdpStatistics(&mibUdpStats) == NO_ERROR)
{
dwLocalInSegs = mibUdpStats.dwInDatagrams;
dwLocalOutSegs = mibUdpStats.dwOutDatagrams;
m_dwPacketsSent += dwLocalOutSegs;
m_dwPacketsReceived += dwLocalInSegs;
if(dwLocalOutSegs > dwSegUdpSent &&
dwLocalInSegs > dwSegUdpRcvd)
{
dwSegUdpSent = dwLocalOutSegs;
dwSegUdpRcvd = dwLocalInSegs;
SetTrayIcon(NIM_MODIFY,
m_hActiveIcon);
goto done;
}
else if(dwLocalOutSegs > dwSegUdpSent &&
dwLocalInSegs <= dwSegUdpRcvd)
{
dwSegUdpSent = dwLocalOutSegs;
SetTrayIcon(NIM_MODIFY,
m_hSendIcon);
goto done;
}
else if(dwLocalInSegs > dwSegUdpRcvd &&
dwLocalOutSegs <= dwSegUdpSent)
{
dwSegUdpRcvd = dwLocalInSegs;
SetTrayIcon(NIM_MODIFY,
m_hReceiveIcon);
goto done;
}
else
nCounter++;
if(nCounter == 10)
{
nCounter = 0;
SetTrayIcon(NIM_MODIFY,
m_hInactiveIcon);
goto done;
}
}
}
if(m_bDisplayICMP)
{
if(GetIcmpStatistics(&mibIcmpStats) == NO_ERROR)
{
dwLocalInSegs =
mibIcmpStats.stats.icmpInStats.dwMsgs;
dwLocalOutSegs =
mibIcmpStats.stats.icmpOutStats.dwMsgs;
m_dwPacketsSent += dwLocalOutSegs;
m_dwPacketsReceived += dwLocalInSegs;
if(dwLocalOutSegs > dwSegIcmpSent &&
dwLocalInSegs > dwSegIcmpRcvd)
{
dwSegIcmpSent = dwLocalOutSegs;
dwSegIcmpRcvd = dwLocalInSegs;
SetTrayIcon(NIM_MODIFY,
m_hActiveIcon);
goto done;
}
else if(dwLocalOutSegs > dwSegIcmpSent &&
dwLocalInSegs <= dwSegIcmpRcvd)
{
dwSegIcmpSent = dwLocalOutSegs;
SetTrayIcon(NIM_MODIFY,
m_hSendIcon);
goto done;
}
else if(dwLocalInSegs > dwSegIcmpRcvd &&
dwLocalOutSegs <= dwSegIcmpSent)
{
dwSegIcmpRcvd = dwLocalInSegs;
SetTrayIcon(NIM_MODIFY,
m_hReceiveIcon);
goto done;
}
else
nCounter++;
if(nCounter == 10)
{
nCounter = 0;
SetTrayIcon(NIM_MODIFY,
m_hInactiveIcon);
goto done;
}
}
}
done:
m_bSetIconContinue = TRUE;
}
Sleep(m_nDuration);
}
m_hTcpThread = NULL;
}
与原始 Windows XP 工具(为每个接口提供单独的指示器)不同,此程序指示所有可用接口上的传入和传出网络数据包。
历史
- 初始发布:2009 年 11 月 20 日
- 更新:2010 年 1 月 14 日
版本 1.2 允许您显示 ICMP 和 UDP 数据包,以字节为单位显示选定的网络接口流量,使用 Vista 风格的图标,并直接访问“网络连接”、“Windows 防火墙”和“网络和共享中心”小程序。