@@ -91,7 +91,7 @@ public MainWindow()
9191
9292 InitSoundEffects ( ) ;
9393 DataObject . AddPastingHandler ( QueryTextBox , QueryTextBox_OnPaste ) ;
94-
94+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged ;
9595 SystemEvents . PowerModeChanged += SystemEvents_PowerModeChanged ;
9696 }
9797
@@ -101,6 +101,11 @@ public MainWindow()
101101
102102#pragma warning disable VSTHRD100 // Avoid async void methods
103103
104+ private void ThemeManager_ActualApplicationThemeChanged ( ModernWpf . ThemeManager sender , object args )
105+ {
106+ _theme . RefreshFrameAsync ( ) ;
107+ }
108+
104109 private void OnSourceInitialized ( object sender , EventArgs e )
105110 {
106111 var handle = Win32Helper . GetWindowHandle ( this , true ) ;
@@ -716,8 +721,26 @@ void InitializePositionInner()
716721 {
717722 if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
718723 {
719- Top = _settings . WindowTop ;
724+ var previousScreenWidth = _settings . PreviousScreenWidth ;
725+ var previousScreenHeight = _settings . PreviousScreenHeight ;
726+ GetDpi ( out var previousDpiX , out var previousDpiY ) ;
727+
728+ _settings . PreviousScreenWidth = SystemParameters . VirtualScreenWidth ;
729+ _settings . PreviousScreenHeight = SystemParameters . VirtualScreenHeight ;
730+ GetDpi ( out var currentDpiX , out var currentDpiY ) ;
731+
732+ if ( previousScreenWidth != 0 && previousScreenHeight != 0 &&
733+ previousDpiX != 0 && previousDpiY != 0 &&
734+ ( previousScreenWidth != SystemParameters . VirtualScreenWidth ||
735+ previousScreenHeight != SystemParameters . VirtualScreenHeight ||
736+ previousDpiX != currentDpiX || previousDpiY != currentDpiY ) )
737+ {
738+ AdjustPositionForResolutionChange ( ) ;
739+ return ;
740+ }
741+
720742 Left = _settings . WindowLeft ;
743+ Top = _settings . WindowTop ;
721744 }
722745 else
723746 {
@@ -730,27 +753,73 @@ void InitializePositionInner()
730753 break ;
731754 case SearchWindowAligns . CenterTop :
732755 Left = HorizonCenter ( screen ) ;
733- Top = 10 ;
756+ Top = VerticalTop ( screen ) ;
734757 break ;
735758 case SearchWindowAligns . LeftTop :
736759 Left = HorizonLeft ( screen ) ;
737- Top = 10 ;
760+ Top = VerticalTop ( screen ) ;
738761 break ;
739762 case SearchWindowAligns . RightTop :
740763 Left = HorizonRight ( screen ) ;
741- Top = 10 ;
764+ Top = VerticalTop ( screen ) ;
742765 break ;
743766 case SearchWindowAligns . Custom :
744- Left = Win32Helper . TransformPixelsToDIP ( this ,
745- screen . WorkingArea . X + _settings . CustomWindowLeft , 0 ) . X ;
746- Top = Win32Helper . TransformPixelsToDIP ( this , 0 ,
747- screen . WorkingArea . Y + _settings . CustomWindowTop ) . Y ;
767+ var customLeft = Win32Helper . TransformPixelsToDIP ( this ,
768+ screen . WorkingArea . X + _settings . CustomWindowLeft , 0 ) ;
769+ var customTop = Win32Helper . TransformPixelsToDIP ( this , 0 ,
770+ screen . WorkingArea . Y + _settings . CustomWindowTop ) ;
771+ Left = customLeft . X ;
772+ Top = customTop . Y ;
748773 break ;
749774 }
750775 }
751776 }
752777 }
753778
779+ private void AdjustPositionForResolutionChange ( )
780+ {
781+ var screenWidth = SystemParameters . VirtualScreenWidth ;
782+ var screenHeight = SystemParameters . VirtualScreenHeight ;
783+ GetDpi ( out var currentDpiX , out var currentDpiY ) ;
784+
785+ var previousLeft = _settings . WindowLeft ;
786+ var previousTop = _settings . WindowTop ;
787+ GetDpi ( out var previousDpiX , out var previousDpiY ) ;
788+
789+ var widthRatio = screenWidth / _settings . PreviousScreenWidth ;
790+ var heightRatio = screenHeight / _settings . PreviousScreenHeight ;
791+ var dpiXRatio = currentDpiX / previousDpiX ;
792+ var dpiYRatio = currentDpiY / previousDpiY ;
793+
794+ var newLeft = previousLeft * widthRatio * dpiXRatio ;
795+ var newTop = previousTop * heightRatio * dpiYRatio ;
796+
797+ var screenLeft = SystemParameters . VirtualScreenLeft ;
798+ var screenTop = SystemParameters . VirtualScreenTop ;
799+
800+ var maxX = screenLeft + screenWidth - ActualWidth ;
801+ var maxY = screenTop + screenHeight - ActualHeight ;
802+
803+ Left = Math . Max ( screenLeft , Math . Min ( newLeft , maxX ) ) ;
804+ Top = Math . Max ( screenTop , Math . Min ( newTop , maxY ) ) ;
805+ }
806+
807+ private void GetDpi ( out double dpiX , out double dpiY )
808+ {
809+ var source = PresentationSource . FromVisual ( this ) ;
810+ if ( source != null && source . CompositionTarget != null )
811+ {
812+ var matrix = source . CompositionTarget . TransformToDevice ;
813+ dpiX = 96 * matrix . M11 ;
814+ dpiY = 96 * matrix . M22 ;
815+ }
816+ else
817+ {
818+ dpiX = 96 ;
819+ dpiY = 96 ;
820+ }
821+ }
822+
754823 private Screen SelectedScreen ( )
755824 {
756825 Screen screen ;
@@ -811,6 +880,13 @@ private double HorizonLeft(Screen screen)
811880 return left ;
812881 }
813882
883+ public double VerticalTop ( Screen screen )
884+ {
885+ var dip1 = Win32Helper . TransformPixelsToDIP ( this , 0 , screen . WorkingArea . Y ) ;
886+ var top = dip1 . Y + 10 ;
887+ return top ;
888+ }
889+
814890 #endregion
815891
816892 #region Window Animation
@@ -1185,6 +1261,7 @@ protected virtual void Dispose(bool disposing)
11851261 _notifyIcon ? . Dispose ( ) ;
11861262 animationSoundWMP ? . Close ( ) ;
11871263 animationSoundWPF ? . Dispose ( ) ;
1264+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged ;
11881265 SystemEvents . PowerModeChanged -= SystemEvents_PowerModeChanged ;
11891266 }
11901267
0 commit comments