diff --git a/WifiScan/Form1.Designer.cs b/WifiScan/Form1.Designer.cs index 415103e..6157a67 100644 --- a/WifiScan/Form1.Designer.cs +++ b/WifiScan/Form1.Designer.cs @@ -31,9 +31,10 @@ this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); this.tvTree = new System.Windows.Forms.TreeView(); - this.scMain = new System.Windows.Forms.SplitContainer(); this.imageListDevices = new System.Windows.Forms.ImageList(this.components); + this.scMain = new System.Windows.Forms.SplitContainer(); this.WifiTimer = new System.Windows.Forms.Timer(this.components); + this.panel1 = new System.Windows.Forms.Panel(); ((System.ComponentModel.ISupportInitialize)(this.scMain)).BeginInit(); this.scMain.Panel1.SuspendLayout(); this.scMain.SuspendLayout(); @@ -47,9 +48,16 @@ this.tvTree.Location = new System.Drawing.Point(0, 0); this.tvTree.Name = "tvTree"; this.tvTree.SelectedImageIndex = 0; - this.tvTree.Size = new System.Drawing.Size(491, 567); + this.tvTree.Size = new System.Drawing.Size(491, 467); this.tvTree.TabIndex = 0; // + // imageListDevices + // + this.imageListDevices.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListDevices.ImageStream"))); + this.imageListDevices.TransparentColor = System.Drawing.Color.Transparent; + this.imageListDevices.Images.SetKeyName(0, "iconfinder_network_card_82824.png"); + this.imageListDevices.Images.SetKeyName(1, "iconfinder_wifi_2639756.ico"); + // // scMain // this.scMain.Dock = System.Windows.Forms.DockStyle.Fill; @@ -59,6 +67,7 @@ // scMain.Panel1 // this.scMain.Panel1.Controls.Add(this.tvTree); + this.scMain.Panel1.Controls.Add(this.panel1); // // scMain.Panel2 // @@ -67,19 +76,20 @@ this.scMain.SplitterDistance = 491; this.scMain.TabIndex = 1; // - // imageListDevices - // - this.imageListDevices.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListDevices.ImageStream"))); - this.imageListDevices.TransparentColor = System.Drawing.Color.Transparent; - this.imageListDevices.Images.SetKeyName(0, "iconfinder_network_card_82824.png"); - this.imageListDevices.Images.SetKeyName(1, "iconfinder_wifi_2639756.ico"); - // // WifiTimer // this.WifiTimer.Enabled = true; this.WifiTimer.Interval = 1000; this.WifiTimer.Tick += new System.EventHandler(this.WifiTimer_Tick); // + // panel1 + // + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Location = new System.Drawing.Point(0, 467); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(491, 100); + this.panel1.TabIndex = 2; + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); @@ -102,6 +112,7 @@ private System.Windows.Forms.SplitContainer scMain; private System.Windows.Forms.ImageList imageListDevices; private System.Windows.Forms.Timer WifiTimer; + private System.Windows.Forms.Panel panel1; } } diff --git a/WifiScan/Form1.cs b/WifiScan/Form1.cs index 1aeba93..b5e05e9 100644 --- a/WifiScan/Form1.cs +++ b/WifiScan/Form1.cs @@ -5,6 +5,7 @@ using System.Data; using System.Drawing; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; @@ -13,13 +14,25 @@ { public partial class Form1 : Form { - public Form1() { InitializeComponent(); AutoScaleDimensions = new SizeF(96F, 96F); AutoScaleMode = AutoScaleMode.Dpi; PopulateTree(); + DblBuf(); + } + + private void DblBuf() + { + var objMethodInfo = typeof(Control).GetMethod("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance); + + var objArgs = new object[] { ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint | + ControlStyles.OptimizedDoubleBuffer, true }; + + objMethodInfo.Invoke(scMain.Panel1, objArgs); + objMethodInfo.Invoke(scMain.Panel2, objArgs); } #region Tree Management @@ -55,6 +68,7 @@ foreach (WifiDevice dev in WifiDevice.List()) { TreeNode node = GetNodeFor(dev); + bool empty = node.Nodes.Count == 0; nodes.Remove(node); Wifi[] wifis = dev.Networks; ArrayList netnodes = new ArrayList(node.Nodes); @@ -65,12 +79,12 @@ } foreach (TreeNode nwdel in netnodes) node.Nodes.Remove(nwdel); + if (empty && node.Nodes.Count > 0) + node.Expand(); } // remove old foreach (TreeNode ndel in nodes) tvTree.Nodes.Remove(ndel); - tvTree.ExpandAll(); - // Take snapshoot of current wifi status and deletes registrations } #endregion diff --git a/WifiScan/Form1.resx b/WifiScan/Form1.resx index 69f5af6..853786e 100644 --- a/WifiScan/Form1.resx +++ b/WifiScan/Form1.resx @@ -124,53 +124,53 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACK - CgAAAk1TRnQBSQFMAgEBAgEAAQgBAAEIAQABGgEAARoBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFo - AwABGgMAAQEBAAEgBQABQAEqIgADMgH/AzIB//8AmQADMgH/AzIB/xQAAzIB/wMyAf8DMgH/AzIB/wMy - Af8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf//AFkAAzIB/wMyAf8UAAMyAf8EAAMyAf8EAAMyAf8EAAMy - Af8EAAMyAf8EAAMyAf//AFkAAzIB/wMyAf8UAAMyAf8EAAMyAf8EAAMyAf8EAAMyAf8EAAMyAf8EAAMy - Af//AFkAAzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8EAAMyAf8EAAMyAf8EAAMyAf8EAAMy - Af8EAAMyAf8DMgH/AzgB7wNCAYA0AAMhATIDMQGeAwQBBf8ADQADMgH/AzIB/wMyAf8DMgH/AzIB/wMy - Af8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMy - Af8DQgGALAADIAExAwAB/wMAAf8DMQGcAwIBA/8ACQADMgH/AzIB/0AAAysBQANFAa8DMgH/AzIB/ygA - AyMBNwMFAfgDAAH/AwAB/wMAAf8DMQGe/wAJAAMyAf8DMgH/RAADGAEgAzIB/wMyAf8kAAMjATYDDAHv - AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgGY/wAFAAMyAf8DMgH/JAADOAHvAzIB/wMyAf8DMgH/AzIB/wMy - Af8DOAHvCAADMgH/AzIB/yQAAwUBBwM0AXgDBwH1AwAB/wMAAf8DAAH/AygBvAMdASv/AAUAAzIB/wMy - Af8kAAMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8IAAMyAf8DMgH/HAADIwE3AygBuwMaASUEAAMI - AQsDJwFAAysBSwMZASQDAAEBAwQBBQM0AXoDMQGe/AADMgH/AzIB/wgAA0EBzwMyAf8DQQHPEAADMgH/ - AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/CAADMgH/AzIB/xgAAyABMQMFAfgDAAH/AwQB+QM0AYEDIgE0 - AxMBGgMPARQDGQEjAy0BUAMfAdADAAH/AwAB/wMxAZ4DAgED9AADMgH/AzIB/wgAAzIB/wMyAf8DMgH/ - AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8IAAMyAf8DMgH/FAADHwEv - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMQGc - AwMBBPAAAzIB/wMyAf8IAANBAc8DMgH/A0EBzxAAAzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wgA - AzIB/wMyAf8UAAMhATIDAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMqAbYDAgED8AADMgH/AzIB/yQAAzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wgA - AzIB/wMyAf8MAAMlAToDLwFYBAADFAEbAx0B1QMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DBgH3AzIBYQMBAQIDBAEFAzQBeOwAAzIB/wMyAf8kAAM4Ae8DMgH/AzIB/wMyAf8DMgH/ - AzIB/wM4Ae8IAAMyAf8DMgH/CAADJgE+Aw0B7QMEAfkDNAGKBwABAQMoAUIDLQGtAwQB+QMAAf8DAAH/ - AwAB/wMAAf8DAAH/AxoB2gM0AXMDEgEYBAADGQEkAxcB3gMAAf8DMQGd6AADMgH/AzIB/0QAAxgBIAMy - Af8DMgH/BAADJQE6Aw0B7QMAAf8DAAH/AwAB/wMgAc0DLAFOAwEBAgQAAw0BEQMmAT4DLwFWAzABWwMs - AUwDGwEoAwABAQQAAxEBFwMyAZYDAgH7AwAB/wMAAf8DAAH/AzEBneQAAzIB/wMyAf9AAAMYASADRAGf - AzIB/wMyAf8EAAMmAcMDAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DHwHQAzQBdwMkATkDEgEYAwUBBwMB - AQIDCgENAxoBJgMvAVYDLwGnAwUB+AMAAf8DAAH/AwAB/wMAAf8DAAH/AwgB9AMgATDgAAMyAf8DMgH/ - AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/ - AzIB/wMyAf8DMgH/AzIB/wNEAZ8HAAEBAyoBtgMBAf0DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/Aw8B6wMrAUvkAAMy - Af8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMyAf8DMgH/AzIB/wMy - Af8DMgH/AzIB/wMyAf8DMgH/A0QBnwMMARAMAAMzAXADBgH3AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf4DIQHMAw0BEegAAzIB/wMy - Af9gAAMNARIDMQGhAwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wMAAf8DCwHwAyUBOgMCAQPsAAMyAf8DMgH/ZwABAQMUARwDMQFfAx8B0AMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwsB8QMyAZcDHwEvAwQBBfQAAzIB/wMyAf90AAMQARYDIwE3Ay0BUAMw - AVsDMQFfAy8BVgMpAUMDGwEnAwQBBfwAAxgBIAMyAf8DMgH//wCRAAMMARADRAGfAzIB/wNFAa//AIkA - AzIB/wMyAf8DMgH/AzIB/wMyAf8DKwFA/wCJAAMyAf8DMgH/AzIB/wNBAc8DKwFA/wCNAAFCAU0BPgcA - AT4DAAEoAwABaAMAARoDAAEBAQABAQUAAaABARYAA/8BAAHzBf8B8AkAAfMB4AEDA/8B8AkAAfMB6gGr - A/8B8AkAAfMB6gGrA/8B8AkAAfABCgGoAX8B/AF/AfAJAAHwAgABPwH4AT8B8AkAAfMB/wH8AT8B8AE/ - AfAJAAHzAf8B/gE/AeABHwHwCQAB8wH+AQMBPwHgAR8B8AkAAfMB/gEDAT8BiAEHAfAJAAHzAR4BAwE/ - AQABAQHwCQAB8wEAAQMBPgIAAfAJAAHzAR4BAwE+AgAB8AkAAfMB/gEDATkCAAFwCQAB8wH+AQMBMAGA - AQQBMAkAAfMB/wH+ASADEAkAAfMB/wH8ASAMAAHwAgABIAIAARAJAAHwAgABOAIAATAJAAHzAv8B/AIA - AXAJAAHzAv8B/gEAAQEB8AkAAfMD/wHgAQ8B8AkAAeMF/wHwCQABwwX/AfAJAAEDBf8B8AkAAQcF/wHw - CQAL + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACI + CgAAAk1TRnQBSQFMAgEBAgEAARABAAEQAQABGgEAARoBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFo + AwABGgMAAQEBAAEgBQABQAEqIgADMQH/AzEB//8AmQADMQH/AzEB/xQAAzEB/wMxAf8DMQH/AzEB/wMx + Af8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf//AFkAAzEB/wMxAf8UAAMxAf8EAAMxAf8EAAMxAf8EAAMx + Af8EAAMxAf8EAAMxAf//AFkAAzEB/wMxAf8UAAMxAf8EAAMxAf8EAAMxAf8EAAMxAf8EAAMxAf8EAAMx + Af//AFkAAzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8EAAMxAf8EAAMxAf8EAAMxAf8EAAMx + Af8EAAMxAf8DMQH/AzwB7wNFAYA0AAMiATIDQwGeAwQBBf8ADQADMQH/AzEB/wMxAf8DMQH/AzEB/wMx + Af8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMx + Af8DRQGALAADIQExAwAB/wMAAf8DRAGcAwIBA/8ACQADMQH/AzEB/0AAAyoBQANNAa8DMQH/AzEB/ygA + AyUBNwMKAfgDAAH/AwAB/wMAAf8DQwGe/wAJAAMxAf8DMQH/RAADFwEgAzEB/wMxAf8kAAMkATYDFQHv + AwAB/wMAAf8DAAH/AwAB/wMAAf8DRAGY/wAFAAMxAf8DMQH/JAADPAHvAzEB/wMxAf8DMQH/AzEB/wMx + Af8DPAHvCAADMQH/AzEB/yQAAwUBBwNAAXgDDgH1AwAB/wMAAf8DAAH/Az0BvAMeASv/AAUAAzEB/wMx + Af8kAAMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8IAAMxAf8DMQH/HAADJQE3Az4BuwMaASUEAAMI + AQsDKgFAAy8BSwMaASQDAAEBAwQBBQNAAXoDQwGe/AADMQH/AzEB/wgAA0sBzwMxAf8DSwHPEAADMQH/ + AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/CAADMQH/AzEB/xgAAyEBMQMKAfgDAAH/AwgB+QNCAYEDIwE0 + AxMBGgMPARQDGQEjAzIBUAMzAdADAAH/AwAB/wNDAZ4DAgED9AADMQH/AzEB/wgAAzEB/wMxAf8DMQH/ + AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8IAAMxAf8DMQH/FAADIAEv + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DRAGc + AwMBBPAAAzEB/wMxAf8IAANLAc8DMQH/A0sBzxAAAzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wgA + AzEB/wMxAf8UAAMiATIDAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wM/AbYDAgED8AADMQH/AzEB/yQAAzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wgA + AzEB/wMxAf8MAAMmAToDNQFYBAADFAEbAzAB1QMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DDAH3AzkBYQMBAQIDBAEFA0ABeOwAAzEB/wMxAf8kAAM8Ae8DMQH/AzEB/wMxAf8DMQH/ + AzEB/wM8Ae8IAAMxAf8DMQH/CAADKQE+AxgB7QMIAfkDQwGKBwABAQMrBEIBrQMIAfkDAAH/AwAB/wMA + Af8DAAH/AwAB/wMsAdoDPgFzAxIBGAQAAxoBJAMnAd4DAAH/A0QBnegAAzEB/wMxAf9EAAMXASADMQH/ + AzEB/wQAAyYBOgMYAe0DAAH/AwAB/wMAAf8DNQHNAzABTgMBAQIEAAMNAREDKQE+AzQBVgM2AVsDMAFM + AxwBKAMAAQEEAAMRARcDQwGWAwQB+wMAAf8DAAH/AwAB/wNEAZ3kAAMxAf8DMQH/QAADFwEgA0sBnwMx + Af8DMQH/BAADOwHDAwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AzMB0ANAAXcDJgE5AxIBGAMFAQcDAQEC + AwoBDQMbASYDNAFWA0MBpwMKAfgDAAH/AwAB/wMAAf8DAAH/AwAB/wMQAfQDIQEw4AADMQH/AzEB/wMx + Af8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMx + Af8DMQH/AzEB/wMxAf8DSwGfBwABAQM/AbYDAgH9AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMcAesDLwFL5AADMQH/ + AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/AzEB/wMxAf8DMQH/ + AzEB/wMxAf8DMQH/AzEB/wNLAZ8DDAEQDAADPQFwAwwB9wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH+AzYBzAMNARHoAAMxAf8DMQH/ + YAADDQESA0QBoQMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AxMB8AMmAToDAgED7AADMQH/AzEB/2cAAQEDFAEcAzgBXwMzAdADAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMTAfEDRAGXAyABLwMEAQX0AAMxAf8DMQH/dAADEAEWAyUBNwMyAVADNgFb + AzgBXwM0AVYDKwFDAxwBJwMEAQX8AAMXASADMQH/AzEB//8AkQADDAEQA0sBnwMxAf8DTQGv/wCJAAMx + Af8DMQH/AzEB/wMxAf8DMQH/AyoBQP8AiQADMQH/AzEB/wMxAf8DSwHPAyoBQP8AjQABQgFNAT4HAAE+ + AwABKAMAAWgDAAEaAwABAQEAAQEFAAGgAQEWAAP/AQAB8wX/AfAJAAHzAeABAwP/AfAJAAHzAeoBqwP/ + AfAJAAHzAeoBqwP/AfAJAAHwAQoBqAF/AfwBfwHwCQAB8AIAAT8B+AE/AfAJAAHzAf8B/AE/AfABPwHw + CQAB8wH/Af4BPwHgAR8B8AkAAfMB/gEDAT8B4AEfAfAJAAHzAf4BAwE/AYgBBwHwCQAB8wEeAQMBPwEA + AQEB8AkAAfMBAAEDAT4CAAHwCQAB8wEeAQMBPgIAAfAJAAHzAf4BAwE5AgABcAkAAfMB/gEDATABgAEE + ATAJAAHzAf8B/gEgAxAJAAHzAf8B/AEgDAAB8AIAASACAAEQCQAB8AIAATgCAAEwCQAB8wL/AfwCAAFw + CQAB8wL/Af4BAAEBAfAJAAHzA/8B4AEPAfAJAAHjBf8B8AkAAcMF/wHwCQABAwX/AfAJAAEHBf8B8AkA + Cw== diff --git a/WifiScan/Wifi.cs b/WifiScan/Wifi.cs index f507fe1..6f43500 100644 --- a/WifiScan/Wifi.cs +++ b/WifiScan/Wifi.cs @@ -16,13 +16,14 @@ private string ssid; private string bssid; private DateTime lastSeen; - private Color color = Color.FromArgb(WifiApi.rnd.Next(200) + 56, WifiApi.rnd.Next(200) + 56, WifiApi.rnd.Next(200) + 56); + private Color color; public Wifi(Wlan.WlanBssEntry network) { this.network = network; bssid = network.GetBSSIDHex(); ssid = network.GetSSID(); + color = WifiApi.ColorForBSSID(bssid); Notify(); } @@ -36,6 +37,11 @@ return new WifiInfo(this); } + public void Update(Wlan.WlanBssEntry network) + { + this.network = network; + } + public string BSSID => bssid; public string SSID => ssid; public bool Active => (DateTime.Now - lastSeen).Seconds < 10; diff --git a/WifiScan/WifiDevice.cs b/WifiScan/WifiDevice.cs index 80d3392..fbe334d 100644 --- a/WifiScan/WifiDevice.cs +++ b/WifiScan/WifiDevice.cs @@ -33,6 +33,7 @@ foreach (WlanClient.WlanInterface wlanIface in client.Interfaces) { WifiDevice dev = GetFor(wlanIface); + dev.iface = wlanIface; del.Remove(dev); } return new List(devices); @@ -80,6 +81,7 @@ foreach (Wlan.WlanBssEntry network in wlanBssEntries) { Wifi wifi = GetFor(network); + wifi.Update(network); wifi.Notify(); } Wifi[] all = networks.ToArray(); diff --git a/WifiScan/WifiInfo.cs b/WifiScan/WifiInfo.cs index 74f49e1..e359f7f 100644 --- a/WifiScan/WifiInfo.cs +++ b/WifiScan/WifiInfo.cs @@ -11,12 +11,14 @@ { public WifiInfo(Wifi wifi) { + BSSID = wifi.BSSID; SSID = wifi.SSID; Signal = wifi.Signal; Channel = wifi.Channel; Color = wifi.Color; } + public string BSSID { get; } public string SSID { get; } public uint Signal { get; } public uint Channel { get; } diff --git a/WifiScan/WifiaPI.cs b/WifiScan/WifiaPI.cs index a788660..8e83317 100644 --- a/WifiScan/WifiaPI.cs +++ b/WifiScan/WifiaPI.cs @@ -21,6 +21,7 @@ private static Brush bText = new SolidBrush(Color.Silver); static List> snap = new List>(); + static Dictionary colors = new Dictionary(); #region Network Extensions public static string GetBSSIDHex(this Wlan.WlanBssEntry network) @@ -48,10 +49,18 @@ #endregion + public static Color ColorForBSSID(string bssid) + { + Color c; + if (colors.TryGetValue(bssid, out c)) + return c; + return colors[bssid] = Color.FromArgb(rnd.Next(220) + 36, rnd.Next(220) + 36, rnd.Next(220) + 36); + } + public static void Snapshoot() { List step = new List(); - foreach(Wifi wifi in WifiDevice.FetchAllNetworks()) + foreach (Wifi wifi in WifiDevice.FetchAllNetworks()) { step.Add(wifi.GetInfo()); } @@ -95,11 +104,10 @@ } //Draw Channels float chw6 = (sz.Width * 4) / 16f; - for (int i = 1; i <= 14; i++) { int x = (int)((sz.Width * (i + 1)) / 16f); - g.DrawString("" + i, font, bText, new PointF(x-10, sz.Height - (CHART_FOOT * scale))); + g.DrawString("" + i, font, bText, new PointF(x - 10, sz.Height - (CHART_FOOT * scale))); g.DrawLine(pLineDark2, new PointF(x, sz.Height), new PointF(x, hh2)); List chw = GetNetworksInChannel(i); foreach (WifiInfo wii in chw) @@ -109,6 +117,34 @@ g.DrawEllipse(pw, new RectangleF(x - (chw6 / 2), sz.Height - (he / 2f), chw6, he)); } } + //Signal History + if (snap.Count < 2) + return; + int ii = snap.Count - 1; + int xx = sz.Width; + while (ii > 0 && xx > 0) + { + List wiis = snap[ii]; + foreach (WifiInfo wii in wiis) + { + List wolds = snap[ii - 1]; + WifiInfo wold = null; + foreach (WifiInfo woldc in wolds) + if (woldc.BSSID == wii.BSSID) + { + wold = woldc; + break; + } + if (wold == null) + continue; + float he = hh2 - ((hh2 * wii.Signal) / 100f); + float heo = hh2 - ((hh2 * wold.Signal) / 100f); + Pen pw = new Pen(wii.Color, 2f); + g.DrawLine(pw, new PointF(xx, he), new PointF(xx - 10, heo)); + } + ii--; + xx -= 10; + } } #endregion }