Provides data for the VirtualDesktop.CurrentChanged event.
상속: System.EventArgs
예제 #1
0
        static IDisposable RegisterMinimalListener()
        {
            var window = new TransparentWindow();

            window.Show();
            Guid?        desktopId  = null;
            var          timeLimit  = TimeSpan.FromSeconds(30);
            var          limitTimer = Stopwatch.StartNew();
            COMException exception  = null;
            int          attempts   = 10;

            while (limitTimer.Elapsed < timeLimit || attempts > 0)
            {
                attempts = Math.Max(0, attempts - 1);
                try {
                    desktopId = VirtualDesktop.IdFromHwnd(window.Handle);
                    exception = null;
                } catch (COMException ex) when(ex.Match(HResult.INVALID_STATE))
                {
                    Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new Action(() => {}));
                    if (limitTimer.Elapsed >= timeLimit && attempts <= 0)
                    {
                        throw;
                    }
                    exception = ex;
                }
            }

            if (desktopId == null && exception != null && limitTimer.Elapsed >= timeLimit)
            {
                throw exception;
            }

            var timer = new DispatcherTimer(DispatcherPriority.Normal)
            {
                Interval  = TimeSpan.FromMilliseconds(250),
                IsEnabled = true,
            };

            timer.Tick += delegate {
                var newId = VirtualDesktop.IdFromHwnd(window.Handle);
                if (newId == null || newId == desktopId)
                {
                    return;
                }
                var newDesktop  = VirtualDesktop.FromId(newId.Value);
                var oldDesktop  = desktopId == null ? null : VirtualDesktop.FromId(desktopId.Value);
                var changedArgs = new VirtualDesktopChangedEventArgs(oldDesktop, newDesktop);
                CurrentChanged?.Invoke(typeof(VirtualDesktop), changedArgs);
                desktopId = newId;
            };

            return(Disposable.Create(() => {
                timer.Stop();
                window.Close();
            }));
        }
            void IVirtualDesktopNotification.CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew)
            {
                var args = new VirtualDesktopChangedEventArgs(FromComObject(pDesktopOld), FromComObject(pDesktopNew));

                if (CurrentChanged != null)
                {
                    CurrentChanged.Invoke(this, args);
                }
            }
 private void VirtualDesktop_CurrentChanged(object sender, VirtualDesktopChangedEventArgs e)
 {
     Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
     {
         // Update Text by Current Desktop GUID
         EventMessage.Text = e.NewDesktop.Id.ToString();
         // Move my window to current virtual desktop
         this.MoveToDesktop(e.NewDesktop);
     }));
 }
예제 #4
0
        private void VirtualDesktopOnCurrentChanged(object sender, VirtualDesktopChangedEventArgs e)
        {
            if (!GeneralSettings.NotificationWhenSwitchedDesktop) return;

            VisualHelper.InvokeOnUIDispatcher(() =>
            {
                var desktops = VirtualDesktop.GetDesktops();
                var newIndex = Array.IndexOf(desktops, e.NewDesktop) + 1;

                this.currentNotificationWindow?.Dispose();
                this.currentNotificationWindow = ShowWindow(newIndex);
            });
        }
        private void VirtualDesktopOnCurrentChanged(object sender, VirtualDesktopChangedEventArgs e)
        {
            if (!Settings.General.NotificationWhenSwitchedDesktop) return;

            VisualHelper.InvokeOnUIDispatcher(() =>
            {
                var desktops = VirtualDesktop.GetDesktops();
                var newIndex = Array.IndexOf(desktops, e.NewDesktop) + 1;

                this._notificationWindow.Disposable = ShowWindow(newIndex);

                // var imgDirectoryPath = @"D:\User\Pictures\vd-bg\";
                var imgDirectoryPath = Settings.General.DesktopBackgroundFolderPath;
                var bmpPath = imgDirectoryPath + newIndex.ToString() + ".bmp";
                if (System.IO.File.Exists(bmpPath))
                {
                    WallpaperService.Set(bmpPath);
                }
            });
        }
예제 #6
0
        private void VirtualDesktopOnCurrentChanged(object sender, VirtualDesktopChangedEventArgs e)
        {
            if (!GeneralSettings.NotificationWhenSwitchedDesktop) return;

            VisualHelper.InvokeOnUIDispatcher(() =>
            {
                var desktops = VirtualDesktop.GetDesktops();
                var newIndex = Array.IndexOf(desktops, e.NewDesktop) + 1;

                this.currentNotificationWindow?.Dispose();

                var vmodel = new NotificationWindowViewModel
                {
                    Title = ProductInfo.Title,
                    Header = "Virtual Desktop Switched",
                    Body = "Current Desktop: Desktop " + newIndex,
                };
                this.currentNotificationWindow = ShowWindow(vmodel);
            });
        }
예제 #7
0
            public static void RaiseCurrentChanged(object sender, VirtualDesktop pDesktopOld, VirtualDesktop pDesktopNew)
            {
                var args = new VirtualDesktopChangedEventArgs(pDesktopOld, pDesktopNew);

                CurrentChanged?.Invoke(sender, args);
            }
예제 #8
0
 private void VirtualDesktop_CurrentChanged(object sender, VirtualDesktopChangedEventArgs e)
 {
     Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action)(() =>
     {
         try
         {
             this.MoveToDesktop(VirtualDesktop.Current);
         }
         catch (InvalidOperationException) { }
     }));
 }
 void IVirtualDesktopNotification.CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew)
 {
     var args = new VirtualDesktopChangedEventArgs(FromComObject(pDesktopOld), FromComObject(pDesktopNew));
     CurrentChanged?.Invoke(this, args);
 }
예제 #10
0
        private void VirtualDesktopOnCurrentChanged(object sender, VirtualDesktopChangedEventArgs e)
        {
            IntPtr[] targets;
            lock (this._sync)
            {
                targets = this._pinnedWindows.Keys.ToArray();
            }

            VisualHelper.InvokeOnUIDispatcher(() =>
            {
                foreach (var hWnd in targets.Where(x => !VirtualDesktopHelper.MoveToDesktop(x, e.NewDesktop)))
                {
                    this._helper.MoveWindowToDesktop(hWnd, e.NewDesktop.Id);
                }
            });
        }
예제 #11
0
        private void VirtualDesktopOnCurrentChanged(object sender, VirtualDesktopChangedEventArgs e)
        {
            Task.Run(() =>
            {
                if (!Settings.General.ChangeBackgroundEachDesktop) return;

                var desktops = VirtualDesktop.GetDesktops();
                var newIndex = Array.IndexOf(desktops, e.NewDesktop) + 1;

                var file = this.GetWallpaperFiles(Settings.General.DesktopBackgroundFolderPath).FirstOrDefault(x => x.Number == newIndex);
                if (file != null) this.Set(file.Filepath);
            });
        }