Zzz – Rev 1
?pathlinks?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Serilog;
using Zzz.Properties;
using Zzz.Utilities;
namespace Zzz.Idle
{
public class WindowPresence : IDisposable
{
#region Public Events & Delegates
public event EventHandler<EventArgs> WindowDetected;
#endregion
#region Private Delegates, Events, Enums, Properties, Indexers and Fields
private readonly CancellationToken _cancellationToken;
private readonly Task _scanTask;
private CancellationTokenSource _cancellationTokenSource;
private Configuration.Configuration _configuration;
#endregion
#region Constructors, Destructors and Finalizers
public WindowPresence(Configuration.Configuration configuration) : this()
{
_configuration = configuration;
}
private WindowPresence()
{
_cancellationTokenSource = new CancellationTokenSource();
_cancellationToken = _cancellationTokenSource.Token;
_scanTask = Scan(_cancellationToken);
}
public void Dispose()
{
_cancellationTokenSource?.Cancel();
_scanTask.Wait(CancellationToken.None);
_cancellationTokenSource = null;
}
#endregion
#region Private Methods
private async Task Scan(CancellationToken cancellationToken)
{
try
{
do
{
try
{
await Task.Delay(TimeSpan.FromMinutes((int) _configuration.Timeout), cancellationToken);
foreach (var title in RefreshWindows())
{
if (!_configuration.WindowsWatchList.Contains(title))
{
continue;
}
WindowDetected?.Invoke(this, EventArgs.Empty);
}
}
catch (Exception ex)
{
Log.Warning(ex, "Window scan failure.");
}
} while (!cancellationToken.IsCancellationRequested);
}
catch (Exception ex)
{
Log.Warning(ex, "Window scan thread terminated.");
}
}
private static IEnumerable<string> RefreshWindows()
{
return Helpers.FindWindows((window, param) => true).Select(Helpers.GetWindowTitle)
.Where(title => !string.IsNullOrEmpty(title));
}
#endregion
}
}
Generated by GNU Enscript 1.6.5.90.