生活随笔
收集整理的這篇文章主要介紹了
C# 流量悬浮窗
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C# 流量懸浮窗
最近覺得360太惡心了,果斷卸載,但是又缺少一個顯示流量的懸浮窗,覺定自己搞一個。
前言
剛開始用Qt(C++)寫的發現體積太大,輸出個HelloWorld就要幾兆果斷放棄,嘗試了一下C#體積小,占內存小,于是轉用C#。之前寫Java,Android都是用的Eclipse,C#要用VS寫,但VS太大了實在接受不了,網上搜了一下SharpDevelop挺好用的,先上個效果圖:
如果要完美的話,可以添加右鍵菜單,網卡切換,網速限制,每個標簽的點擊顯示應用詳情事件,最小化到任務欄等等,由于時間關系就不寫這么多了,就只寫顯示,拖動,鎖定這幾個功能
##布局
5個Label顯示RAM,CPU,磁盤占用率,上、下傳流量,怎么好看怎么擺放。
RAM需要背景顯示占用百分比,占用率超過70%背景邊框變紅,需要繼承Label重寫OnPaintBackground
代碼如下:
public partial class BGLabel : Label
{public bool BackColorVisible=true;public bool BorderColorVisible=true;public int Taget=70;public int Value=00;public BGLabel(){}protected override void OnPaintBackground (PaintEventArgs e){base.OnPaintBackground(e);if(BackColorVisible){if(Value>=Taget){Brush brush=new SolidBrush(Color.Red);int height=Height*Value/100;e.Graphics.FillRectangle(brush,0,Height-height,Width,Height);}else{Brush brush=new SolidBrush(Color.Green);int height=Height*Value/100;e.Graphics.FillRectangle(brush,0,Height-height,Width,Height);}}if(BorderColorVisible&&Value>=Taget){Pen pen = new Pen(Color.Red,1);e.Graphics.DrawRectangle(pen,0,0,Width-1,Height-1);}}
}
##點擊事件
按住鼠標左鍵拖動,應同學要求右鍵點擊鎖定,再次點擊解除鎖定
繼承 IMessageFilter 接口
partial class MainForm: Form , IMessageFilter
重寫 PreFilterMessage(ref Message m) 方法
private bool isLock=false;
private bool isMove=false;
private bool isClick=false;
private int curXPosition;
private int curYPosition;
// WM_MOUSEMOVE= $0200 移動鼠標
// WM_LBUTTONDOWN= $0201 按下鼠標左鍵
// WM_LBUTTONUP= $0202 釋放鼠標左鍵
// WM_RBUTTONDOWN= $0204 按下鼠標右鍵
// WM_RBUTTONUP= $0205 釋放鼠標右鍵public bool PreFilterMessage(ref Message m)
{if(m.Msg==0x0204){isMove = true;isClick = true;return true;}else if (m.Msg == 0x0205&&isClick){isMove = false;isLock=!isLock;return true;}else if (!isLock&&m.Msg == 0x0201){isMove = true;isClick = true;curXPosition = MousePosition.X;curYPosition = MousePosition.Y;return false;}else if(!isLock&&m.Msg == 0x0200&&isMove){isClick=false;this.Left += MousePosition.X - curXPosition;this.Top += MousePosition.Y - curYPosition;curXPosition = MousePosition.X;curYPosition = MousePosition.Y;return true;}else if(!isLock&&m.Msg == 0x0202){isMove = false;return !isClick;}return false;
}
事件對應的Msg的ID請移步【C#】Message類的屬性Msg所關聯的消息ID
最后不要忘了在構造函數中添加過濾
Application.AddMessageFilter(this);
##獲取占用率
使用性能計數器PerformanceCounter監控上下傳流量,CPU,磁盤占用率,
使用GlobalMemoryStatus函數獲取RAM占用率
public class Monitor
{private Network network;private Cpu cpu;private Ram ram;private Disk disk;public Monitor(){PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface");foreach (string name in category.GetInstanceNames()){if (name == "MS TCP Loopback interface")continue;Network n = new Network(name);if(n.isConnect){network=n;break;}}cpu=new Cpu();ram=new Ram();disk=new Disk();}public void refresh(){network.refresh();cpu.refresh();ram.refresh();disk.refresh();}public string getDownSpeed(){return network.getFormatDownSpeed();}public string getUpSpeed(){return network.getFormatUpSpeed();}public int getCpuUtil(){return cpu.curValue;}public int getRamUtil(){return ram.curValue;}public int getDiskUtil(){return disk.curValue;}public bool isDownSpeedChange(){return network.isDownSpeedChange;}public bool isUpSpeedChange(){return network.isUpSpeedChange;}public bool isCpuUtilChange(){return cpu.curValue!=cpu.oldValue;}public bool isRamUtilChange(){return ram.curValue!=ram.oldValue;}public bool isDiskUtilChange(){return disk.curValue!=disk.oldValue;}
}public class Network{public string name { get; private set; }public long downSpeed{ get; private set;}public long upSpeed{ get; private set; }public bool isDownSpeedChange{ get; private set; }public bool isUpSpeedChange{ get; private set; }public bool isConnect{ get; private set; }private PerformanceCounter downCounter, upCounter;private long downValue, upValue;private long downValueOld, upValueOld;private long downSpeedOld,upSpeedOld;public Network(string name){this.name=name;downCounter = new PerformanceCounter("Network Interface", "Bytes Received/sec", name);upCounter = new PerformanceCounter("Network Interface", "Bytes Sent/sec", name);if(downCounter==null||upCounter==null)return;downValueOld=downCounter.NextSample().RawValue;upValueOld=upCounter.NextSample().RawValue;if(downSpeedOld>0||upValueOld>0)isConnect=true;else isConnect=false;}public void refresh(){if(downCounter==null||upCounter==null){downSpeed=0;upSpeed=0;return;}if(downCounter.NextSample()==null||upCounter.NextSample()==null){downSpeed=0;upSpeed=0;return;}downValue = downCounter.NextSample().RawValue;upValue = upCounter.NextSample().RawValue;downSpeed = downValue - downValueOld;upSpeed = upValue - upValueOld;isDownSpeedChange=(downSpeed!=downValue);isUpSpeedChange=(upSpeed!=upSpeedOld);downSpeedOld=downSpeed;upSpeedOld=upSpeed;downValueOld=downValue;upValueOld=upValue;}public string getFormatDownSpeed(){return format(downSpeed);}public string getFormatUpSpeed(){return format(upSpeed);}private string format(long num){double n=num/1024.0;if(n>=1000.0)return (n/1024).ToString("0.00")+"MB/s";else if(n>=100.0)return n.ToString("0.0")+"KB/s";else return n.ToString("0.00")+"KB/s";}
}public class Cpu{public int curValue { get; private set; }public int oldValue { get; private set; }private PerformanceCounter counter;public Cpu(){counter = new PerformanceCounter("Processor", "% Processor Time","_Total"); curValue=(int)counter.NextValue(); }public void refresh(){oldValue=curValue;curValue=(int)counter.NextValue();}
}public class Ram{public struct MEMORYSTATUS{public uint dwLength;public uint dwMemoryLoad;public ulong dwTotalPhys;public ulong dwAvailPhys;public ulong dwTotalPageFile;public ulong dwAvailPageFile;public ulong dwTotalVirtual;public ulong dwAvailVirtual;public ulong dwAvailExtendedVirtual;}public int curValue { get; private set; }public int oldValue { get; private set; }private MEMORYSTATUS mStatus;[DllImport("kernel32.dll")]public static extern void GlobalMemoryStatus(ref MEMORYSTATUS stat);public Ram(){GlobalMemoryStatus(ref mStatus);curValue=(int)(mStatus.dwMemoryLoad);}public void refresh(){oldValue=curValue;GlobalMemoryStatus(ref mStatus);curValue=(int)(mStatus.dwMemoryLoad);}
}public class Disk{public int curValue { get; private set; }public int oldValue { get; private set; }private PerformanceCounter counter;public Disk(){counter=new PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");int num=(int)counter.NextValue();curValue=num>100?100:num;}public void refresh(){oldValue=curValue;int num=(int)counter.NextValue();curValue=num>100?100:num;}
}
最后添加timer,1s更新一次不變的就不更新了
private void timer_Tick(object sender, System.EventArgs e)
{monitor.refresh();if(monitor.isRamUtilChange()){lab_0.Value=monitor.getRamUtil();lab_0.Text="RAM\n"+monitor.getRamUtil()+"%";}if(monitor.isDownSpeedChange())lab_1.Text=monitor.getDownSpeed();if(monitor.isUpSpeedChange())lab_2.Text=monitor.getUpSpeed();if(monitor.isCpuUtilChange()){lab_3.Value=monitor.getCpuUtil();lab_3.Text="CPU "+monitor.getCpuUtil()+"%";}if(monitor.isDiskUtilChange()){lab_4.Value=monitor.getDiskUtil();lab_4.Text="DISK "+monitor.getDiskUtil()+"%";}
}
到此結束,雖然有些Bug,但不影響使用
Github: https://github.com/kunorz/FloatingWindow
總結
以上是生活随笔為你收集整理的C# 流量悬浮窗的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。