diff --git a/WifiScan/Form1.Designer.cs b/WifiScan/Form1.Designer.cs index 6157a67..f65986d 100644 --- a/WifiScan/Form1.Designer.cs +++ b/WifiScan/Form1.Designer.cs @@ -33,23 +33,33 @@ this.tvTree = new System.Windows.Forms.TreeView(); this.imageListDevices = new System.Windows.Forms.ImageList(this.components); this.scMain = new System.Windows.Forms.SplitContainer(); + this.pwinfo = new System.Windows.Forms.Panel(); + this.lbInfo2 = new System.Windows.Forms.Label(); + this.cbVisible = new System.Windows.Forms.CheckBox(); + this.lbInfo = new System.Windows.Forms.Label(); + this.btColor = new System.Windows.Forms.Button(); + this.pbSignal = new System.Windows.Forms.ProgressBar(); 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(); + this.pwinfo.SuspendLayout(); this.SuspendLayout(); // // tvTree // this.tvTree.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvTree.FullRowSelect = true; + this.tvTree.HideSelection = false; this.tvTree.ImageIndex = 0; this.tvTree.ImageList = this.imageListDevices; 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, 467); + this.tvTree.Size = new System.Drawing.Size(350, 437); + this.tvTree.StateImageList = this.imageListDevices; this.tvTree.TabIndex = 0; + this.tvTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvTree_AfterSelect); // // imageListDevices // @@ -57,6 +67,8 @@ 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"); + this.imageListDevices.Images.SetKeyName(2, "no wifi.png"); + this.imageListDevices.Images.SetKeyName(3, "hidden_invisible_hide_eye_private-512.png"); // // scMain // @@ -67,29 +79,90 @@ // scMain.Panel1 // this.scMain.Panel1.Controls.Add(this.tvTree); - this.scMain.Panel1.Controls.Add(this.panel1); + this.scMain.Panel1.Controls.Add(this.pwinfo); // // scMain.Panel2 // this.scMain.Panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.splitContainer1_Panel2_Paint); this.scMain.Size = new System.Drawing.Size(1237, 567); - this.scMain.SplitterDistance = 491; + this.scMain.SplitterDistance = 350; + this.scMain.SplitterWidth = 15; this.scMain.TabIndex = 1; // + // pwinfo + // + this.pwinfo.Controls.Add(this.lbInfo2); + this.pwinfo.Controls.Add(this.cbVisible); + this.pwinfo.Controls.Add(this.lbInfo); + this.pwinfo.Controls.Add(this.btColor); + this.pwinfo.Controls.Add(this.pbSignal); + this.pwinfo.Dock = System.Windows.Forms.DockStyle.Bottom; + this.pwinfo.Location = new System.Drawing.Point(0, 437); + this.pwinfo.Name = "pwinfo"; + this.pwinfo.Size = new System.Drawing.Size(350, 130); + this.pwinfo.TabIndex = 2; + // + // lbInfo2 + // + this.lbInfo2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lbInfo2.AutoSize = true; + this.lbInfo2.Location = new System.Drawing.Point(12, 23); + this.lbInfo2.Name = "lbInfo2"; + this.lbInfo2.Size = new System.Drawing.Size(21, 20); + this.lbInfo2.TabIndex = 4; + this.lbInfo2.Text = " "; + // + // cbVisible + // + this.cbVisible.AutoSize = true; + this.cbVisible.Location = new System.Drawing.Point(12, 56); + this.cbVisible.Name = "cbVisible"; + this.cbVisible.Size = new System.Drawing.Size(139, 24); + this.cbVisible.TabIndex = 3; + this.cbVisible.Text = "Show graphics"; + this.cbVisible.UseVisualStyleBackColor = true; + this.cbVisible.CheckedChanged += new System.EventHandler(this.cbVisible_CheckedChanged); + // + // lbInfo + // + this.lbInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lbInfo.AutoSize = true; + this.lbInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbInfo.Location = new System.Drawing.Point(12, 3); + this.lbInfo.Name = "lbInfo"; + this.lbInfo.Size = new System.Drawing.Size(24, 20); + this.lbInfo.TabIndex = 2; + this.lbInfo.Text = " "; + // + // btColor + // + this.btColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btColor.Location = new System.Drawing.Point(315, 86); + this.btColor.Name = "btColor"; + this.btColor.Size = new System.Drawing.Size(32, 32); + this.btColor.TabIndex = 1; + this.btColor.UseVisualStyleBackColor = false; + this.btColor.Click += new System.EventHandler(this.btColor_Click); + // + // pbSignal + // + this.pbSignal.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pbSignal.Location = new System.Drawing.Point(12, 86); + this.pbSignal.Name = "pbSignal"; + this.pbSignal.Size = new System.Drawing.Size(297, 32); + this.pbSignal.TabIndex = 0; + // // 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); @@ -98,10 +171,13 @@ this.Controls.Add(this.scMain); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "Form1"; - this.Text = "WifiScan"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "WifiScan V1.1"; this.scMain.Panel1.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.scMain)).EndInit(); this.scMain.ResumeLayout(false); + this.pwinfo.ResumeLayout(false); + this.pwinfo.PerformLayout(); this.ResumeLayout(false); } @@ -112,7 +188,12 @@ private System.Windows.Forms.SplitContainer scMain; private System.Windows.Forms.ImageList imageListDevices; private System.Windows.Forms.Timer WifiTimer; - private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel pwinfo; + private System.Windows.Forms.Button btColor; + private System.Windows.Forms.ProgressBar pbSignal; + private System.Windows.Forms.Label lbInfo; + private System.Windows.Forms.CheckBox cbVisible; + private System.Windows.Forms.Label lbInfo2; } } diff --git a/WifiScan/Form1.cs b/WifiScan/Form1.cs index b5e05e9..23469a4 100644 --- a/WifiScan/Form1.cs +++ b/WifiScan/Form1.cs @@ -21,6 +21,7 @@ AutoScaleMode = AutoScaleMode.Dpi; PopulateTree(); DblBuf(); + ShowWifi(null); } private void DblBuf() @@ -50,18 +51,32 @@ private TreeNode GetNodeFor(Wifi wifi, TreeNodeCollection nodes) { foreach (TreeNode node in nodes) - { - if (wifi == node.Tag) + if (wifi.BSSID == ((Wifi)node.Tag).BSSID) + { + node.Tag = wifi; return node; - } + } TreeNode nnode = nodes.Add(wifi.SSID); nnode.Tag = wifi; nnode.ImageIndex = 1; nnode.SelectedImageIndex = 1; - nnode.ForeColor = wifi.Color; + nnode.ForeColor = wifi.Conf.Color; return nnode; } + private TreeNode[] GetNodesFor(Wifi wifi) + { + List result = new List(); + foreach (TreeNode nodeHW in tvTree.Nodes) + { + TreeNodeCollection nodes = nodeHW.Nodes; + foreach (TreeNode node in nodes) + if (wifi.BSSID == ((Wifi)node.Tag).BSSID) + result.Add(node); + } + return result.ToArray(); + } + private void PopulateTree() { ArrayList nodes = new ArrayList(tvTree.Nodes); @@ -75,10 +90,14 @@ foreach (Wifi wifi in wifis) { TreeNode nwnode = GetNodeFor(wifi, node.Nodes); + nwnode.ImageIndex = nwnode.SelectedImageIndex = 1; + nwnode.ForeColor = wifi.Conf.Color; netnodes.Remove(nwnode); } foreach (TreeNode nwdel in netnodes) - node.Nodes.Remove(nwdel); + { + nwdel.ImageIndex = nwdel.SelectedImageIndex = 2; //node.Nodes.Remove(nwdel); + } if (empty && node.Nodes.Count > 0) node.Expand(); } @@ -89,6 +108,36 @@ #endregion + private void ShowWifi(Wifi w) + { + pwinfo.Tag = w; + if (w == null) + pwinfo.Visible = false; + else + { + WifiApi.HighlightBSSID = w.BSSID; + lbInfo.Text = w.SSID; + lbInfo2.Text = w.Active ? w.BSSID + ", Ch:" + w.Channel + ", Power:" + w.Signal : w.BSSID; + pbSignal.Value = w.Active ? (int)w.Signal : 0; + btColor.BackColor = w.Conf.Color; + cbVisible.Checked = w.Conf.Visible; + pwinfo.Visible = true; + } + scMain.Panel2.Invalidate(); + } + + private void UpdateNode(Wifi w) + { + if (w == null) + return; + TreeNode[] ns = GetNodesFor(w); + foreach (TreeNode n in ns) + { + n.StateImageIndex = w.Conf.Visible ? -1 : 3; + n.ForeColor = w.Conf.Color; + } + } + private void WifiTimer_Tick(object sender, EventArgs e) { WifiApi.Snapshoot(); @@ -100,5 +149,37 @@ { WifiApi.Paint(e.Graphics, scMain.Panel2.ClientSize); } + + private void tvTree_AfterSelect(object sender, TreeViewEventArgs e) + { + if (tvTree.SelectedNode == null) + return; + ShowWifi(tvTree.SelectedNode.Tag as Wifi); + } + + private void btColor_Click(object sender, EventArgs e) + { + Wifi w = pwinfo.Tag as Wifi; + if (w == null) + return; + ColorDialog cd = new ColorDialog(); + cd.Color = w.Conf.Color; + if (cd.ShowDialog() == DialogResult.OK) + { + w.Conf.Color = cd.Color; + ShowWifi(w); + UpdateNode(w); + } + } + + private void cbVisible_CheckedChanged(object sender, EventArgs e) + { + Wifi w = pwinfo.Tag as Wifi; + if (w == null) + return; + w.Conf.Visible = cbVisible.Checked; + ShowWifi(w); + UpdateNode(w); + } } } diff --git a/WifiScan/Form1.resx b/WifiScan/Form1.resx index 853786e..e7af932 100644 --- a/WifiScan/Form1.resx +++ b/WifiScan/Form1.resx @@ -124,53 +124,110 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - 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== + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD+ + FwAAAk1TRnQBSQFMAgEBBAEAASgBAAEoAQABGgEAARoBAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFo + AwABNAMAAQEBAAEgBQABgAFU/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A + /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AjAADLgH/Ay4B//8AmQADLgH/ + Ay4B/xQAAy4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf//AFkAAy4B/wMu + Af8UAAMuAf8EAAMuAf8EAAMuAf8EAAMuAf8EAAMuAf8EAAMuAf//AFkAAy4B/wMuAf8UAAMuAf8EAAMu + Af8EAAMuAf8EAAMuAf8EAAMuAf8EAAMuAf/sAAMaASQDQgGuA0QBlwMIAQsMAAMgAS4DRAGhAz8BugM+ + AbsDRAGmA0ABegMkATYDAAEBMAADLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wQAAy4B/wQA + Ay4B/wQAAy4B/wQAAy4B/wQAAy4B/wMuAf8DRgHvA0YBgDQAAyIBMgNPAZ4DBAEFXAADJgE4AyYBODwA + A0IBrgMAAf8DAAH/AzwBwAMJAQwIAAMBAQIDRAGaAwAB/wMAAf8DAAH/AwAB/wMAAf8DMAHVAzYBWwMA + AQEoAAMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/ + Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wNGAYAsAAMhATEDAAH/AwAB/wNPAZwDAgEDVAADJgE4 + AZQBlQGUAfEBlAGVAZQB8QMmATg4AANEAZcDAAH/AwAB/wMAAf8DPAHAAwkBDAgAAwEBAgNEAZoDAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DPgG+AxQBGyQAAy4B/wMuAf9AAAMqAUADVAGvAy4B/wMuAf8oAAMl + ATcDFwH4AwAB/wMAAf8DAAH/A08BnlAAAyYBOAGUAZUBlAHxAZ8BogGfAf8BnwGiAZ8B/wGUAZUBlAHx + AyYBODQAAwgBCwM6AcYDAAH/AwAB/wMAAf8DPAHAAwkBDAgAAwEBAgM/AXQDQwGoAyIB5AMAAf8DAAH/ + AwAB/wMAAf8DHwHnAyMBMyAAAy4B/wMuAf9EAAMXASADLgH/Ay4B/yQAAyQBNgMsAe8DAAH/AwAB/wMA + Af8DAAH/AwAB/wNOAZhIAAMmATkBlAGVAZQB8QGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/ + AZQBlQGUAfEDJgE5MAADHQEqAx4B6QMAAf8DAAH/AwAB/wMAAf8DPAHAAwgBCxAAAwEBAgMvAUsDMgHS + AwAB/wMAAf8DAAH/AxMB8AMjATMcAAMuAf8DLgH/JAADRgHvAy4B/wMuAf8DLgH/Ay4B/wMuAf8DRgHv + CAADLgH/Ay4B/yQAAwUBBwNDAXgDGwH1AwAB/wMAAf8DAAH/A1MBvAMeAStIAAMlATYBgwGFAYMB2wGf + AaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AYMBhQGDAdsDJQE2LAADFQEdAyQB4wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wM8AcADCQEMFAADBAEGA0MBkgMAAf8DAAH/AwAB/wMeAekDGAEiGAADLgH/ + Ay4B/yQAAy4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wgAAy4B/wMuAf8cAAMlATcDVAG7AxoBJQQA + AwgBCwMqAUADMAFLAxoBJAMAAQEDBAEFA0QBegNPAZ44AAMmATkDPwFnBAADBAEFAzEBTQFMAU0BTAGB + AUwBTQFMAYEDMQFNAwQBBQQAAz8BZwMmATkgAAMHAQoDNQHOAwAB/wMAAf8DAAH/A0MBhQM8AcADAAH/ + AwAB/wMAAf8DPAHAAwkBDBgAA0ABeQMAAf8DAAH/AwAB/wMyAdIDBwEKFAADLgH/Ay4B/wgAA1cBzwMu + Af8DVwHPEAADLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/CAADLgH/Ay4B/xgAAyEBMQMXAfgDAAH/ + AxQB+QNGAYEDIwE0AxMBGgMPARQDGQEjAzIEUAHQAwAB/wMAAf8DTwGeAwIBAywAAyYBOAGUAZUBlAHx + AZ8BogGfAf8BZwFoAWcBsgMlATYQAAMlATYBZwFoAWcBsgGfAaIBnwH/AZQBlQGUAfEDJgE4HAADQwGe + AwAB/wMAAf8DAAH/A0MBjQQAAwgBCwM8AcADAAH/AwAB/wMAAf8DPAHAAwgBCxgAA0IBiAMAAf8DAAH/ + AwAB/wNEAZ0UAAMuAf8DLgH/CAADLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/ + Ay4B/wMuAf8DLgH/Ay4B/wgAAy4B/wMuAf8UAAMgAS8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wNPAZwDAwEEJAADJgE4AZQBlQGUAfEBnwGiAZ8B/wGf + AaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGLAY0BiwHlAXIBdAFyAcMBcgF0AXIBwwGLAY0BiwHlAZ8BogGf + Af8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BlAGVAZQB8QMmATgUAAMzAVMDAAH/AwAB/wMAAf8DQgGy + AwEBAggAAwkBDAM8AcADAAH/AwAB/wMAAf8DPAHAAwkBDBQAAwEBAgNBAbMDAAH/AwAB/wMAAf8DMgFS + EAADLgH/Ay4B/wgAA1cBzwMuAf8DVwHPEAADLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/CAADLgH/ + Ay4B/xQAAyIBMgMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/A1IBtgMCAQMkAANgAaUBnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/ + AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGi + AZ8B/wGfAaIBnwH/A2ABpRQAAyQB4wMAAf8DAAH/AyYB4QMNAREQAAMkATYDAAH/AwAB/wMAAf8DAAH/ + AzwBwAMIAQsUAAMNARIDJQHiAwAB/wMAAf8DJAHjEAADLgH/Ay4B/yQAAy4B/wMuAf8DLgH/Ay4B/wMu + Af8DLgH/Ay4B/wgAAy4B/wMuAf8MAAMnAToDNQFYBAADFAEbA00B1QMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DGgH3AzoBYQMBAQIDBAEFA0MBeBgAAyEBMAMJAQwDAwEEA04BgwGa + AZ0BmgH8AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGf + Af8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BmgGdAZoB/ANOAYMDAwEEAwkBDAMhATAMAAMkAeMDAAH/ + AwAB/wMlAeIDDQESEAADIgEyAwAB/wMAAf8DAAH/AwAB/wMAAf8DPAHAAwgBCxAAAw0BEgMlAeIDAAH/ + AwAB/wMkAeMQAAMuAf8DLgH/JAADRgHvAy4B/wMuAf8DLgH/Ay4B/wMuAf8DRgHvCAADLgH/Ay4B/wgA + AykBPgMxAe0DFAH5A0oBigcAAQEDKwFCA1MBrQMUAfkDAAH/AwAB/wMAAf8DAAH/AwAB/wNKAdoDQQFz + AxIBGAQAAxoBJANEAd4DAAH/A08BnRAAAycBOgGUAZYBlAHyAXgBeQF4AcwDFgEfBAADHwEsAWEBYgFh + AacBmwGeAZsB+gGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGb + AZ4BmwH6AWEBYgFhAacDHwEsBAADFgEfAXgBeQF4AcwBlAGWAZQB8gMnAToIAAMyAVIDAAH/AwAB/wMA + Af8DQQGzAwEBAgwAAwIBAwMsAdkDAAH/AwAB/wMAAf8DAAH/AwAB/wM8AcADCQEMDAADPQFvAwAB/wMA + Af8DAAH/AzIBURAAAy4B/wMuAf9EAAMXASADLgH/Ay4B/wQAAycBOgMxAe0DAAH/AwAB/wMAAf8DUAHN + AzEBTgMBAQIEAAMNAREDKQE+AzUBVgM3AVsDMAFMAxwBKAMAAQEEAAMRARcDTQGWAwoB+wMAAf8DAAH/ + AwAB/wNPAZ0IAAMnAToBlAGWAZQB8gGfAaIBnwH/AZ8BogGfAf8BkQGUAZEB8AFAAUEBQAFqAwMBBAQA + AwwBEAMzAVADTAGAAVcBWAFXAZYBVwFYAVcBlgNMAYADMwFQAwwBEAQAAwMBBAFAAUEBQAFqAZEBlAGR + AfABnwGiAZ8B/wGfAaIBnwH/AZQBlgGUAfIDJwE6CAADRAGdAwAB/wMAAf8DAAH/A0IBiBAAAx4BKwMs + AdkDAAH/AwAB/wMAAf8DAAH/AwAB/wM8AcADCAELCAADAQECA0QBmgMAAf8DRAGbFAADLgH/Ay4B/0AA + AxcBIANQAZ8DLgH/Ay4B/wQAA1MBwwMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wNQAdADQwF3AyYBOQMS + ARgDBQEHAwEBAgMKAQ0DGwEmAzUBVgNRAacDFwH4AwAB/wMAAf8DAAH/AwAB/wMAAf8DIAH0AyEBMAMM + ARABkQGTAZEB7gGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BhgGHAYYB4ANI + AXkDGgEkGAADGgEkA0gBeQGGAYcBhgHgAZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGi + AZ8B/wGRAZMBkQHuAwwBEAQAAwcBCgMyAdIDAAH/AwAB/wMAAf8DQAF3EAADAgEDAyIBMgMkATYDPAHA + AwAB/wMAAf8DAAH/AzwBwAMIAQsIAAMBAQIDQAF4AwcBChQAAy4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/ + Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/ + A1ABnwcAAQEDUgG2AwUB/QMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DNwHrAzABSwgAAzEBTQGUAZcBlAH0AZ8BogGf + Af8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8DjQHoA3MBxANl + Aa0DZQGtA3MBxAONAegBnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGf + Af8BnwGiAZ8B/wGUAZcBlAH0AzEBTQwAAxgBIgMeAekDAAH/AwAB/wMAAf8DRAGQAwQBBRQAAwkBDAM8 + AcADAAH/AwAB/wMAAf8DPAHAAwkBDCQAAy4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/ + Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DLgH/Ay4B/wMuAf8DUAGfAwwBEAwAA0ABcAMa + AfcDAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/gNRAcwDDQEREAADHQEpAXoBewF6Ac4BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGi + AZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/ + AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BegF7 + AXoBzgMdASkUAAMjATMDEwHwAwAB/wMAAf8DAAH/AzUBzwMtAUcDAAEBEAADCgEOAyoB3QMAAf8DAAH/ + AwAB/wM8AcADCQEMIAADLgH/Ay4B/2AAAw0BEgNRAaEDAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMpAfADJwE6AwIBAxgAAwMBBANDAW8BjQGPAY0B6gGf + AaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGf + Af8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BjQGPAY0B6gND + AW8DAwEEHAADIwEzAx8B5wMAAf8DAAH/AwAB/wMAAf8DJgHfA0MBogNDAYQDQwGFA0MBpQMhAeUDAAH/ + AwAB/wMAAf8DAAH/AwAB/wM8AcADCAELHAADLgH/Ay4B/2cAAQEDFAEcAzkBXwNQAdADAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMpAfEDTgGXAyABLwMEAQUoAAMHAQoDPgFmA3MBxAGfAaIBnwH9 + AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGiAZ8B/wGfAaIBnwH/AZ8BogGfAf8BnwGi + AZ8B/wGfAaIBnwH9A3MBxAM+AWYDBwEKKAADFAEbAz4BvgMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wNEAZccAAMuAf8DLgH/dAADEAEWAyUBNwMy + AVADNwFbAzkBXwM1AVYDKwFDAxwBJwMEAQVAAAMPARQDMgFOA0kBewFXAVgBVwGWA14BogNeAaIBVwFY + AVcBlgNJAXsDMgFOAw8BFDsAAQEDNgFbAzAB1QMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AzkByQMyAVADPAHAAwAB/wMAAf8DQgGuGAADFwEgAy4B/wMuAf//AEQAAQEDJAE2A0ABegNEAaYDPgG7 + Az4BuwNDAaQDPwF1Ax8BLQgAAwgBCwNEAZcDQgGuAxoBJBQAAwwBEANQAZ8DLgH/A1QBr/8AiQADLgH/ + Ay4B/wMuAf8DLgH/Ay4B/wMqAUD/AIkAAy4B/wMuAf8DLgH/A1cBzwMqAUD/AI0AAUIBTQE+BwABPgMA + ASgDAAFoAwABNAMAAQEBAAEBBQABQAEDFgAD//8AogAB8wz/AwAB8wHgAQMK/wMAAfMB6gGrCv8DAAHz + AeoBqwf/AYcBAAH/AwAB8AEKAagBfwH8AX8C/wE/Af8BgwEAAT8DAAHwAgABPwH4AT8B/wH+AR8B/wGB + AYABHwMAAfMB/wH8AT8B8AE/Af8B/AEPAf8BgAHAAQ8DAAHzAf8B/gE/AeABHwH/AfgBBwH/AYABeAEH + AwAB8wH+AQMBPwHgAR8B/wH4AQcB/wEAAT4BAwMAAfMB/gEDAT8BiAEHAf8B5AEJAf4BAAEfAYEDAAHz + AR4BAwE/AQABAQH/AcEB4AH+AQgBDwHBAwAB8wEAAQMBPgIAAf8BgAEAAXwBDAEHAcADAAHzAR4BAwE+ + AgAB/wGAAQABfAEeAQMB4AMAAfMB/gEDATkCAAF+AgABHAEeAQEB4AMAAfMB/gEDATABgAEEATwBIAEB + AQwBDgEAAeADAAHzAf8B/gEgAhABGAEIAQQBBgEPAQABYQMAAfMB/wH8ASADAAEDAfABAgEHAYABMQMA + AfACAAEgAgABGAIAAQcBAQHwAR8DAAHwAgABOAIAATwCAAEPAYABeAEPAwAB8wL/AfwCAAF+AgABHwHA + AQABBwMAAfMC/wH+AQABAQH/AYABAAF/AeABAAEHAwAB8wP/AeABDwH/AfABAwH/AfABAAEHAwAB4wn/ + AfwBAQGHAwABwwz/AwABAwz/AwABBwz/AwAL diff --git a/WifiScan/Wifi.cs b/WifiScan/Wifi.cs index 6f43500..43423d5 100644 --- a/WifiScan/Wifi.cs +++ b/WifiScan/Wifi.cs @@ -16,14 +16,14 @@ private string ssid; private string bssid; private DateTime lastSeen; - private Color color; + private WifiConf conf; public Wifi(Wlan.WlanBssEntry network) { this.network = network; bssid = network.GetBSSIDHex(); ssid = network.GetSSID(); - color = WifiApi.ColorForBSSID(bssid); + conf = WifiApi.GetConf(bssid); Notify(); } @@ -45,8 +45,8 @@ public string BSSID => bssid; public string SSID => ssid; public bool Active => (DateTime.Now - lastSeen).Seconds < 10; - public Color Color => color; public uint Signal => network.linkQuality; public uint Channel => network.GetChannel(); + public WifiConf Conf => conf; } } diff --git a/WifiScan/WifiConf.cs b/WifiScan/WifiConf.cs new file mode 100644 index 0000000..c526dac --- /dev/null +++ b/WifiScan/WifiConf.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WifiScan +{ + class WifiConf + { + public Color Color { get; set; } = Color.FromArgb(WifiApi.rnd.Next(220) + 36, WifiApi.rnd.Next(220) + 36, WifiApi.rnd.Next(220) + 36); + public bool Visible { get; set; } = true; + } +} diff --git a/WifiScan/WifiDevice.cs b/WifiScan/WifiDevice.cs index fbe334d..6c56983 100644 --- a/WifiScan/WifiDevice.cs +++ b/WifiScan/WifiDevice.cs @@ -41,6 +41,8 @@ #endregion + private bool alive; + public static Wifi[] FetchAllNetworks() { List wifis = new List(); @@ -77,7 +79,15 @@ private Wifi[] GetNetworks() { Scan(); - Wlan.WlanBssEntry[] wlanBssEntries = iface.GetNetworkBssList(); + Wlan.WlanBssEntry[] wlanBssEntries; + try + { + wlanBssEntries = iface.GetNetworkBssList(); + } + catch + { + return new Wifi[0]; + } foreach (Wlan.WlanBssEntry network in wlanBssEntries) { Wifi wifi = GetFor(network); @@ -96,11 +106,20 @@ if (DateTime.Now.Subtract(lastScan).Seconds < 3) return; lastScan = DateTime.Now; - iface.Scan(); + try + { + alive = true; + iface.Scan(); + } + catch + { + alive = false; + } } public Wifi[] Networks => GetNetworks(); public string Name => iface.InterfaceDescription; + public bool Alive => alive; } } diff --git a/WifiScan/WifiInfo.cs b/WifiScan/WifiInfo.cs index e359f7f..a8bcd86 100644 --- a/WifiScan/WifiInfo.cs +++ b/WifiScan/WifiInfo.cs @@ -9,19 +9,20 @@ { class WifiInfo { + WifiConf c; public WifiInfo(Wifi wifi) { BSSID = wifi.BSSID; SSID = wifi.SSID; Signal = wifi.Signal; Channel = wifi.Channel; - Color = wifi.Color; + c = wifi.Conf; } public string BSSID { get; } public string SSID { get; } public uint Signal { get; } public uint Channel { get; } - public Color Color { get; } + public WifiConf Conf => c; } } diff --git a/WifiScan/WifiScan.csproj b/WifiScan/WifiScan.csproj index e77ac9e..3477065 100644 --- a/WifiScan/WifiScan.csproj +++ b/WifiScan/WifiScan.csproj @@ -59,6 +59,7 @@ + diff --git a/WifiScan/WifiaPI.cs b/WifiScan/WifiaPI.cs index 8e83317..40910ff 100644 --- a/WifiScan/WifiaPI.cs +++ b/WifiScan/WifiaPI.cs @@ -21,7 +21,7 @@ private static Brush bText = new SolidBrush(Color.Silver); static List> snap = new List>(); - static Dictionary colors = new Dictionary(); + static Dictionary confs = new Dictionary(); #region Network Extensions public static string GetBSSIDHex(this Wlan.WlanBssEntry network) @@ -49,22 +49,17 @@ #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(); + Dictionary step = new Dictionary(); foreach (Wifi wifi in WifiDevice.FetchAllNetworks()) - { - step.Add(wifi.GetInfo()); - } - snap.Add(step); + if (wifi.Active) + { + WifiInfo prior; + if (!(step.TryGetValue(wifi.BSSID, out prior) && prior.Signal > wifi.Signal)) + step[wifi.BSSID] = wifi.GetInfo(); + } + snap.Add(step.Values.ToList()); } private static List GetLastScan() @@ -112,8 +107,10 @@ List chw = GetNetworksInChannel(i); foreach (WifiInfo wii in chw) { + if (!wii.Conf.Visible) + continue; float he = (sz.Height * wii.Signal) / 100f; - Pen pw = new Pen(wii.Color, 2f); + Pen pw = new Pen(wii.Conf.Color, wii.BSSID == HighlightBSSID ? 7f : 2f); g.DrawEllipse(pw, new RectangleF(x - (chw6 / 2), sz.Height - (he / 2f), chw6, he)); } } @@ -127,6 +124,8 @@ List wiis = snap[ii]; foreach (WifiInfo wii in wiis) { + if (!wii.Conf.Visible) + continue; List wolds = snap[ii - 1]; WifiInfo wold = null; foreach (WifiInfo woldc in wolds) @@ -139,7 +138,9 @@ continue; float he = hh2 - ((hh2 * wii.Signal) / 100f); float heo = hh2 - ((hh2 * wold.Signal) / 100f); - Pen pw = new Pen(wii.Color, 2f); + Pen pw = new Pen(wii.Conf.Color, wii.BSSID == HighlightBSSID ? 7f : 2f); + pw.StartCap = LineCap.Round; + pw.EndCap = LineCap.Round; g.DrawLine(pw, new PointF(xx, he), new PointF(xx - 10, heo)); } ii--; @@ -147,5 +148,18 @@ } } #endregion + + #region WifiConf + public static WifiConf GetConf(string bssid) + { + WifiConf cnf; + if (confs.TryGetValue(bssid, out cnf)) + return cnf; + return confs[bssid] = new WifiConf(); + } + #endregion + + public static string HighlightBSSID { get; set; } + } } diff --git a/res/Thumbs.db b/res/Thumbs.db new file mode 100644 index 0000000..575c312 --- /dev/null +++ b/res/Thumbs.db Binary files differ diff --git a/res/hidden_invisible_hide_eye_private-512.png b/res/hidden_invisible_hide_eye_private-512.png new file mode 100644 index 0000000..980674a --- /dev/null +++ b/res/hidden_invisible_hide_eye_private-512.png Binary files differ diff --git a/res/no wifi.ico b/res/no wifi.ico new file mode 100644 index 0000000..df73e1c --- /dev/null +++ b/res/no wifi.ico Binary files differ diff --git a/res/no wifi.png b/res/no wifi.png new file mode 100644 index 0000000..4d26eb4 --- /dev/null +++ b/res/no wifi.png Binary files differ