예제 #1
0
 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;
		}
예제 #3
0
        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;
 }
		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);
		}
예제 #8
0
        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);
        }