简体   繁体   中英

C# How can I update or refresh functions when new data is present?

I am working on a small program to make my life easier at work. It looks for the Username, Host name, MAC address and IP addresses.

When the user hovers their mouse over the system tray icon, a tool tip will appear with all of the information. As of right now it works great, except when a new network connection is presented it will not get the IP.

I have to shutdown the program and reopen it before it will get the new IP address. What can I do to so it will grab the IP address of a new detected network connection without restarting my application.

I don't think I want a timed refresh, it might hog up too many resources. I included the meat and potatoes of my application.

class ProcessIcon : IDisposable
{
    /// <summary>
    /// The NotifyIcon object.
    /// </summary>
    NotifyIcon ni;

    /// <summary>
    /// Initializes a new instance of the <see cref="ProcessIcon"/> class.
    /// </summary>
    // Instantiate the NotifyIcon object.
    public ProcessIcon()
    {
        ni = new NotifyIcon();
    }

    //Get DNS of computer
    public static string GetDNS()
    {
        String strHostName = string.Empty;
        strHostName = Dns.GetHostName();
        return strHostName;
    }

    //Get IP Address(s) of computer
    static public string GetIP()
    {
        string strReturn = string.Empty;

        //This gets the computers DNS
        String strHostName = string.Empty;
        strHostName = Dns.GetHostName();

        // Then using host name, get the IP address list..
        IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
        IPAddress[] addr = ipEntry.AddressList;

        List<string> lstIP = new List<string>();

        for (int i = 0; i < addr.Length; i++)
        {
            if (addr[i].AddressFamily == AddressFamily.InterNetworkV6)
            {
                    //DO NOTHING. This If statements checks for IPV6 addresses and excludes them from the output.
            }
            else
            {
                //This if statement checks if the address is a IPV4 and if it is, it adds it to the string.
                if (addr[i].AddressFamily == AddressFamily.InterNetwork)
                {
                    strReturn += (addr[i].ToString() + "\t");
                }
                else
                {
                        //Nothing for now
                }
            }                
        }     
        return strReturn;
    }

    //Gets the computers MAC address for ethernet
    public static string getMAC()
    {
        string macAddresses = "";
        foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
        // Only consider Ethernet network interfaces, thereby ignoring any
        // loopback devices etc.
        if (nic.NetworkInterfaceType != NetworkInterfaceType.Ethernet) continue;
            if (nic.OperationalStatus == OperationalStatus.Up)
            {
                macAddresses += nic.GetPhysicalAddress().ToString();
                break;
            }
        }
        return macAddresses;    
    }

    public static string GetUSER()
    {
        string username = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

        return username;
    }


    //String that combines the DNS,MAC and IP address strings into one that is formatted for easy viewing.
    public static string showALL()
    {
        string showALL = "User: " + GetUSER() + Environment.NewLine + "DNS: " + GetDNS() + Environment.NewLine + "MAC: " + getMAC() + Environment.NewLine + "IP: " + GetIP();
        return showALL;
    }

    /// <summary>
    /// Displays the icon in the system tray.
    /// </summary>
    public void Display()
    {
        // Put the icon in the system tray and allow it react to mouse clicks.          
        ni.MouseClick += new MouseEventHandler(ni_MouseClick1);
        ni.Icon = Resources.SystemTrayApp;
        Fixes.SetNotifyIconText(ni,showALL());
        ni.Visible = true;

        // Attach a context menu.
        ni.ContextMenuStrip = new ContextMenus().Create();
    }

    private void ni_MouseClick(object sender, MouseEventArgs e)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Releases unmanaged and - optionally - managed resources
    /// </summary>

    // When the application closes, this will remove the icon from the system tray immediately.
    public void Dispose()
    {
        ni.Dispose();
    }

    /// <summary>
    /// Handles the MouseClick event of the ni control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.Windows.Forms.MouseEventArgs"/> instance containing the event data.</param>
    void ni_MouseClick1 (object sender, MouseEventArgs e)
    {
        // Handle mouse button clicks.
        if (e.Button == MouseButtons.Left)
        {

        Form1 form1 = new Form1();

        form1.Text = "Whats my IP";
        form1.Show();
        form1.ShowInTaskbar = false;
        }
    }

You can broadcast a signal whenever data changes and register your function with a listener who listens for that broadcast. registerReceiver can be used for later and for broadcasting the signal their should be some function in C# like Intent in android.

You can add the event NetworkChange.NetworkAddressChanged and take action to update the data, example:

        static void Main(string[] args) 
        { 
              try 
              { 
                    NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged); 
                    Console.ReadLine(); 
              } 
              catch (Exception e) 
              { 
                    Console.WriteLine(e); 
              } 
        } 

        static void NetworkChange_NetworkAddressChanged(object sender, EventArgs e) 
        { 
              Console.WriteLine(" do Something"); 
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM