private void captureApplicationsOnCurrentDisplays(bool initialCapture = false) { lock (_displayChangeLock) { var desktopKey = _desktopService.GetDesktopKey(); _logger?.LogInformation($"Capture applications for desktop '{desktopKey}' started."); try { if (!_desktopApplications.TryGetValue(desktopKey, out var applications)) { _logger.LogInformation($"New desktop with DesktopKey '{desktopKey}' has been identified."); applications = new SortedDictionary <string, ApplicationDisplayMetrics>(); _desktopApplications.Add(desktopKey, applications); } var updateLogs = new List <string>(); var updateApps = new List <ApplicationDisplayMetrics>(); var appWindows = _windowService.CaptureWindowsOfInterest(); foreach (var window in appWindows) { if (hasWindowChanged(applications, window, out ApplicationDisplayMetrics curDisplayMetrics)) { updateApps.Add(curDisplayMetrics); _logger.LogTrace($"[{window.Title}][{(window.Visible ? "V" : "H")}] {curDisplayMetrics.ToString()}"); } } for (var i = 0; i < updateApps.Count; i++) { var curDisplayMetrics = updateApps[i]; if (applications.TryGetValue(curDisplayMetrics.Key, out var appMetrics)) { appMetrics.WindowPlacement = curDisplayMetrics.WindowPlacement; appMetrics.ScreenPosition = curDisplayMetrics.ScreenPosition; } else { applications.Add(curDisplayMetrics.Key, curDisplayMetrics); } } _logger?.LogInformation($"Capture applications for desktop '{desktopKey}' completed."); } catch (Exception ex) { _logger?.LogError(ex, $"Capture applications for desktop '{desktopKey}' failed."); } } }
public void WaitForWindowStabilization(Action completeCallback, int additionalDelayInMs = 0) { var previousLocations = new Dictionary <IntPtr, RECT>(); var currentLocations = new Dictionary <IntPtr, RECT>(); if (previousLocations.Count == 0) { var windows = _windowService.CaptureWindowsOfInterest(); getWindowLocations(previousLocations, windows); } while (true) { _logger?.LogTrace("Windows not stable, waiting..."); //await Delay(100); Thread.Sleep(STABILIZATION_WAIT_INTERVAL); var windows = _windowService.CaptureWindowsOfInterest(); getWindowLocations(currentLocations, windows); if (doLocationsMatch(previousLocations, currentLocations)) { if (additionalDelayInMs > 0) { Thread.Sleep(additionalDelayInMs); } completeCallback(); break; } previousLocations.Clear(); foreach (var currentLocation in currentLocations) { previousLocations[currentLocation.Key] = currentLocation.Value; } currentLocations.Clear(); } }