private void OnCheckProcessProgressChanged(object sender, ProgressChangedEventArgs e) { if (e.ProgressPercentage != -1) { return; } OnStatusChanged?.Invoke(this, new ProcessStatusEventArgs(_newStatus)); _lastStatus = _newStatus; }
public ExternalProcessesWatcher() { _lastStatus = BarVsProcessStatus.NotOnTop; _newStatus = BarVsProcessStatus.Hidden; _checkProcess = new BackgroundWorker(); _checkProcess.WorkerReportsProgress = true; _checkProcess.WorkerSupportsCancellation = true; _checkProcess.DoWork += OnCheckProcessDoWork; _checkProcess.RunWorkerCompleted += OnCheckProcessCompleted; _checkProcess.ProgressChanged += OnCheckProcessProgressChanged; _checkTimer = new Timer(); _checkTimer.Enabled = false; _checkTimer.Tick += OnCheckTimerTick; }
public ProcessStatusEventArgs(BarVsProcessStatus status) { Status = status; }
private void OnCheckProcessProgressChanged(object sender, ProgressChangedEventArgs e) { if (e.ProgressPercentage != -1) return; OnStatusChanged?.Invoke(this, new ProcessStatusEventArgs(_newStatus)); _lastStatus = _newStatus; }
private void OnCheckProcessDoWork(object sender, DoWorkEventArgs e) { _checkTimer.Stop(); _currentIteration = 0; _newStatus = BarVsProcessStatus.OnTop; if (Process.GetProcesses() .Any(process => _processConfiguration .Any(processConfiguration => processConfiguration.Behaviour == ExternalProcessBehaviour.HideIfProcessIsRunning && String.Compare(processConfiguration.Name, process.ProcessName, StringComparison.OrdinalIgnoreCase) == 0))) { _newStatus = BarVsProcessStatus.Hidden; _checkProcess.ReportProgress(-1); return; } do { uint processId; var foregroundWindow = WinAPIHelper.GetForegroundWindow(); WinAPIHelper.GetWindowThreadProcessId(foregroundWindow, out processId); var p = Process.GetProcessById((int)processId); var processName = p.ProcessName.ToLower(); if (processName == "idle") continue; // Ignore Idle process _newStatus = BarVsProcessStatus.OnTop; foreach (var processConfiguration in _processConfiguration.Where(configuration => new[] { ExternalProcessBehaviour.HideIfIsActive, ExternalProcessBehaviour.HideIfIsActiveAndMaximized, ExternalProcessBehaviour.SetNotOnTopIfIsActive, ExternalProcessBehaviour.HideIfTitlebarMatches} .Contains(configuration.Behaviour))) { try { if (processConfiguration.Behaviour == ExternalProcessBehaviour.HideIfTitlebarMatches) { if (!p.MainWindowTitle.Contains(processConfiguration.Name)) continue; _newStatus = BarVsProcessStatus.Hidden; break; } if (String.Compare(processName, processConfiguration.Name, StringComparison.OrdinalIgnoreCase) != 0) continue; switch (processConfiguration.Behaviour) { case ExternalProcessBehaviour.HideIfIsActive: _newStatus = BarVsProcessStatus.Hidden; break; case ExternalProcessBehaviour.HideIfIsActiveAndMaximized: if (IsMaximized(p)) _newStatus = BarVsProcessStatus.Hidden; break; case ExternalProcessBehaviour.SetNotOnTopIfIsActive: _newStatus = BarVsProcessStatus.NotOnTop; break; } } catch { } } if (_newStatus != _lastStatus) { _checkProcess.ReportProgress(-1); return; } Thread.Sleep(Delay); } while (_currentIteration++ < Iterations); }
private void OnCheckProcessDoWork(object sender, DoWorkEventArgs e) { _checkTimer.Stop(); _currentIteration = 0; _newStatus = BarVsProcessStatus.OnTop; if (Process.GetProcesses() .Any(process => _processConfiguration .Any(processConfiguration => processConfiguration.Behaviour == ExternalProcessBehaviour.HideIfProcessIsRunning && String.Compare(processConfiguration.Name, process.ProcessName, StringComparison.OrdinalIgnoreCase) == 0))) { _newStatus = BarVsProcessStatus.Hidden; _checkProcess.ReportProgress(-1); return; } do { uint processId; var foregroundWindow = WinAPIHelper.GetForegroundWindow(); WinAPIHelper.GetWindowThreadProcessId(foregroundWindow, out processId); var p = Process.GetProcessById((int)processId); var processName = p.ProcessName.ToLower(); if (processName == "idle") { continue; // Ignore Idle process } _newStatus = BarVsProcessStatus.OnTop; foreach (var processConfiguration in _processConfiguration.Where(configuration => new[] { ExternalProcessBehaviour.HideIfIsActive, ExternalProcessBehaviour.HideIfIsActiveAndMaximized, ExternalProcessBehaviour.SetNotOnTopIfIsActive, ExternalProcessBehaviour.HideIfTitlebarMatches } .Contains(configuration.Behaviour))) { try { if (processConfiguration.Behaviour == ExternalProcessBehaviour.HideIfTitlebarMatches) { if (!p.MainWindowTitle.Contains(processConfiguration.Name)) { continue; } _newStatus = BarVsProcessStatus.Hidden; break; } if (String.Compare(processName, processConfiguration.Name, StringComparison.OrdinalIgnoreCase) != 0) { continue; } switch (processConfiguration.Behaviour) { case ExternalProcessBehaviour.HideIfIsActive: _newStatus = BarVsProcessStatus.Hidden; break; case ExternalProcessBehaviour.HideIfIsActiveAndMaximized: if (IsMaximized(p)) { _newStatus = BarVsProcessStatus.Hidden; } break; case ExternalProcessBehaviour.SetNotOnTopIfIsActive: _newStatus = BarVsProcessStatus.NotOnTop; break; } } catch { } } if (_newStatus != _lastStatus) { _checkProcess.ReportProgress(-1); return; } Thread.Sleep(Delay); }while (_currentIteration++ < Iterations); }