Ejemplo n.º 1
0
        private void UpdateThumbnailsList()
        {
            Process[]     clientProcesses = ThumbnailManager.GetClientProcesses();
            List <IntPtr> processHandles  = new List <IntPtr>(clientProcesses.Length);

            IntPtr foregroundWindowHandle = DwmApiNativeMethods.GetForegroundWindow();

            List <IThumbnailView> viewsAdded   = new List <IThumbnailView>();
            List <IThumbnailView> viewsUpdated = new List <IThumbnailView>();
            List <IThumbnailView> viewsRemoved = new List <IThumbnailView>();

            foreach (Process process in clientProcesses)
            {
                IntPtr processHandle = process.MainWindowHandle;
                string processTitle  = process.MainWindowTitle;
                processHandles.Add(processHandle);

                IThumbnailView view;
                this._thumbnailViews.TryGetValue(processHandle, out view);

                if ((view == null) && (processTitle != ""))
                {
                    view                  = this._thumbnailViewFactory.Create(processHandle, processTitle, this._configuration.ThumbnailSize);
                    view.IsEnabled        = true;
                    view.IsOverlayEnabled = this._configuration.ShowThumbnailOverlays;
                    view.SetSizeLimitations(this._configuration.ThumbnailMinimumSize, this._configuration.ThumbnailMaximumSize);
                    view.SetTopMost(this._configuration.ShowThumbnailsAlwaysOnTop);
                    view.SetFrames(this._configuration.ShowThumbnailFrames);
                    view.ThumbnailLocation = this._configuration.GetThumbnailLocation(processTitle, this._activeClientTitle, view.ThumbnailLocation);

                    view.ThumbnailResized   = this.ThumbnailViewResized;
                    view.ThumbnailMoved     = this.ThumbnailViewMoved;
                    view.ThumbnailFocused   = this.ThumbnailViewFocused;
                    view.ThumbnailLostFocus = this.ThumbnailViewLostFocus;
                    view.ThumbnailActivated = this.ThumbnailActivated;

                    view.RegisterHotkey(this._configuration.GetClientHotkey(processTitle));

                    this._thumbnailViews.Add(processHandle, view);

                    this.ApplyClientLayout(processHandle, processTitle);

                    viewsAdded.Add(view);
                }
                else if ((view != null) && (processTitle != view.Title))                 // update thumbnail title
                {
                    view.Title = processTitle;
                    view.RegisterHotkey(this._configuration.GetClientHotkey(processTitle));

                    this.ApplyClientLayout(processHandle, processTitle);

                    viewsUpdated.Add(view);
                }

                if (process.MainWindowHandle == foregroundWindowHandle)
                {
                    this._activeClientHandle = process.MainWindowHandle;
                    this._activeClientTitle  = process.MainWindowTitle;
                }
            }

            // Cleanup
            IList <IntPtr> obsoleteThumbnails = new List <IntPtr>();

            foreach (IntPtr processHandle in this._thumbnailViews.Keys)
            {
                if (!processHandles.Contains(processHandle))
                {
                    obsoleteThumbnails.Add(processHandle);
                }
            }

            foreach (IntPtr processHandle in obsoleteThumbnails)
            {
                IThumbnailView view = this._thumbnailViews[processHandle];

                this._thumbnailViews.Remove(processHandle);

                view.UnregisterHotkey();

                view.ThumbnailResized   = null;
                view.ThumbnailMoved     = null;
                view.ThumbnailFocused   = null;
                view.ThumbnailLostFocus = null;
                view.ThumbnailActivated = null;

                view.Close();

                viewsRemoved.Add(view);
            }

            this.ThumbnailsAdded?.Invoke(viewsAdded);
            this.ThumbnailsUpdated?.Invoke(viewsUpdated);
            this.ThumbnailsRemoved?.Invoke(viewsRemoved);
        }