2015-09-15 5 views
2

Может кто-нибудь дать мне несколько идей о том, как я могу это достичь?Получите компьютеры, которые в настоящее время используют мое приложение winforms

Я хочу иметь приложение мониторинга, в котором перечислены имя компьютера и IP-адрес компьютеров, на которых в настоящее время открыто мое приложение winform, конечно, имя компьютера и ip должны исчезнуть при закрытии приложения.

Я думал о том, что просто использую таблицу базы данных, которую я обновляю, когда мое приложение запускается или закрывается, но это создавало бы проблемы, если приложение прерывается анонимно, а таблица не обновляется.

Я смотрю мониторинг в реальном времени здесь, если я открываю приложение для мониторинга, тогда я получаю все ПК, запускающие приложение, список затем обновляется через интервалы X.

Спасибо.

+0

Можете ли вы раскрывать, какое приложение вы разрабатываете? Просто архитектура высокого уровня. Потому что может быть другой лучший подход, чтобы сделать это, и кто-то может вам это предложить. – niksofteng

+1

«это вызовет проблемы, если приложение будет прервано ненормально, а таблица не будет обновлена». Я думаю, что у вас будет эта проблема независимо от того, как вы это сделаете. Компьютер может просто потерять власть! Лучшее, что вы можете сделать, это сообщение «heartbeat», которое отправляется с определенной скоростью, и если вы не получили его через некоторое время, то клиент предположительно отключился. (Это может быть реализовано для вас в зависимости от того, как вы работаете в сети.) – 31eee384

+0

@vnikhil no specific application, у меня есть несколько приложений winforms в C# и vb.net, и я просто хочу отслеживать, используется ли он в настоящее время или нет. – crimson

ответ

0
  1. DispatcherTimer Чтобы обновить информацию с интервалом времени, вы можете использовать DispatcherTimer.
  2. Используйте следующий код для определения IP-адреса

    private static string GetIpAddress() 
    { 
        string localIP = "?"; 
        var host = Dns.GetHostEntry(Dns.GetHostName()); 
        foreach (var ip in host.AddressList.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork)) 
        { 
         localIP = ip.ToString(); 
        } 
        return localIP; 
    } 
    
  3. Чтобы получить имя компьютера

    var name = Environment.MachineName; 
    
  4. Для обнаружения системы собирается завершить работу в то время как приложение работает фон и нужно обновить статус

    private bool _systemShutdown; 
    protected override void WndProc(ref Message m) 
    { 
        if (m.Msg == WmQueryendSession) 
        { 
         _systemShutdown = true; // call here method to update status 
        } 
        base.WndProc(ref m); 
    } 
    
  5. Для определения статуса LAN, Unplugged или подключен

    NetworkChange.NetworkAvailabilityChanged += NetworkChange_NetworkAvailabilityChanged; 
    
    using Microsoft.Win32; 
    
    private void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) 
    {    
        _connectionStatus = !e.IsAvailable ? ConnectionStatus.Unplugged : ConnectionStatus.Connected; 
    } 
    
  6. Получить Последняя машина Войти Время

    private static DateTime? GetLastLoginToMachine(string machineName, string userName) 
    { 
        try 
        { 
         var c = new PrincipalContext(ContextType.Machine, machineName); 
         using (var uc = UserPrincipal.FindByIdentity(c, userName)) 
         { 
          if (uc != null) return uc.LastLogon; 
         } 
        } 
        catch (Exception ex) 
        { 
         ExceptionLogger.CreateFile(ex); 
        } 
        return null; 
    } 
    
  7. Набор приложений для запуска при запуске

    private void RunWindowsStartup(object sender, EventArgs e) 
    { 
        var menuItem = ((MenuItem)(sender)); 
        menuItem.Checked = !menuItem.Checked; 
        RegisterInStartup(menuItem.Checked); 
    } 
    private static void RegisterInStartup(bool isChecked) 
    { 
        try 
        { 
         var appName = AppDomain.CurrentDomain.FriendlyName.Split('.')[0]; 
         using (var registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true)) 
         { 
          if (registryKey == null) return; 
          if (isChecked) 
          { 
           registryKey.SetValue(appName, Application.ExecutablePath); 
          } 
          else 
          { 
           registryKey.DeleteValue(appName); 
          } 
         } 
        } 
        catch (Exception ex) 
        { 
         ExceptionLogger.CreateFile(ex); 
         TlMessageBox.Show(ex.Message, "Error", TlMessageBoxButtons.OK, TlMessageBoxIcon.Error, ex.StackTrace); 
        } 
    } 
    
  8. Получить активный неактивный (Idle) Время

    [DllImport("User32.dll")] 
    public static extern bool LockWorkStation(); 
    [DllImport("User32.dll")] 
    private static extern bool GetLastInputInfo(ref LASTINPUTINFO Dummy); 
    public static uint GetIdleTime() 
    { 
        var LastUserAction = new LASTINPUTINFO(); 
        LastUserAction.cbSize = (uint)Marshal.SizeOf(LastUserAction); 
        GetLastInputInfo(ref LastUserAction); 
        return ((uint)Environment.TickCount - LastUserAction.dwTime); 
    } 
    internal struct LASTINPUTINFO 
    { 
        public uint cbSize; 
        public uint dwTime; 
    } 
    
    // Use System.Windows.Form.Timer Tick event for further calculations ... 
    
Смежные вопросы