@@ -90,7 +90,7 @@ public MainWindow()
9090
9191 InitSoundEffects ( ) ;
9292 DataObject . AddPastingHandler ( QueryTextBox , QueryTextBox_OnPaste ) ;
93-
93+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged ;
9494 SystemEvents . PowerModeChanged += SystemEvents_PowerModeChanged ;
9595 }
9696
@@ -100,6 +100,11 @@ public MainWindow()
100100
101101#pragma warning disable VSTHRD100 // Avoid async void methods
102102
103+ private void ThemeManager_ActualApplicationThemeChanged ( ModernWpf . ThemeManager sender , object args )
104+ {
105+ _theme . RefreshFrameAsync ( ) ;
106+ }
107+
103108 private void OnSourceInitialized ( object sender , EventArgs e )
104109 {
105110 var handle = Win32Helper . GetWindowHandle ( this , true ) ;
@@ -740,8 +745,26 @@ void InitializePositionInner()
740745 {
741746 if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
742747 {
743- Top = _settings . WindowTop ;
748+ var previousScreenWidth = _settings . PreviousScreenWidth ;
749+ var previousScreenHeight = _settings . PreviousScreenHeight ;
750+ GetDpi ( out var previousDpiX , out var previousDpiY ) ;
751+
752+ _settings . PreviousScreenWidth = SystemParameters . VirtualScreenWidth ;
753+ _settings . PreviousScreenHeight = SystemParameters . VirtualScreenHeight ;
754+ GetDpi ( out var currentDpiX , out var currentDpiY ) ;
755+
756+ if ( previousScreenWidth != 0 && previousScreenHeight != 0 &&
757+ previousDpiX != 0 && previousDpiY != 0 &&
758+ ( previousScreenWidth != SystemParameters . VirtualScreenWidth ||
759+ previousScreenHeight != SystemParameters . VirtualScreenHeight ||
760+ previousDpiX != currentDpiX || previousDpiY != currentDpiY ) )
761+ {
762+ AdjustPositionForResolutionChange ( ) ;
763+ return ;
764+ }
765+
744766 Left = _settings . WindowLeft ;
767+ Top = _settings . WindowTop ;
745768 }
746769 else
747770 {
@@ -754,27 +777,73 @@ void InitializePositionInner()
754777 break ;
755778 case SearchWindowAligns . CenterTop :
756779 Left = HorizonCenter ( screen ) ;
757- Top = 10 ;
780+ Top = VerticalTop ( screen ) ;
758781 break ;
759782 case SearchWindowAligns . LeftTop :
760783 Left = HorizonLeft ( screen ) ;
761- Top = 10 ;
784+ Top = VerticalTop ( screen ) ;
762785 break ;
763786 case SearchWindowAligns . RightTop :
764787 Left = HorizonRight ( screen ) ;
765- Top = 10 ;
788+ Top = VerticalTop ( screen ) ;
766789 break ;
767790 case SearchWindowAligns . Custom :
768- Left = Win32Helper . TransformPixelsToDIP ( this ,
769- screen . WorkingArea . X + _settings . CustomWindowLeft , 0 ) . X ;
770- Top = Win32Helper . TransformPixelsToDIP ( this , 0 ,
771- screen . WorkingArea . Y + _settings . CustomWindowTop ) . Y ;
791+ var customLeft = Win32Helper . TransformPixelsToDIP ( this ,
792+ screen . WorkingArea . X + _settings . CustomWindowLeft , 0 ) ;
793+ var customTop = Win32Helper . TransformPixelsToDIP ( this , 0 ,
794+ screen . WorkingArea . Y + _settings . CustomWindowTop ) ;
795+ Left = customLeft . X ;
796+ Top = customTop . Y ;
772797 break ;
773798 }
774799 }
775800 }
776801 }
777802
803+ private void AdjustPositionForResolutionChange ( )
804+ {
805+ var screenWidth = SystemParameters . VirtualScreenWidth ;
806+ var screenHeight = SystemParameters . VirtualScreenHeight ;
807+ GetDpi ( out var currentDpiX , out var currentDpiY ) ;
808+
809+ var previousLeft = _settings . WindowLeft ;
810+ var previousTop = _settings . WindowTop ;
811+ GetDpi ( out var previousDpiX , out var previousDpiY ) ;
812+
813+ var widthRatio = screenWidth / _settings . PreviousScreenWidth ;
814+ var heightRatio = screenHeight / _settings . PreviousScreenHeight ;
815+ var dpiXRatio = currentDpiX / previousDpiX ;
816+ var dpiYRatio = currentDpiY / previousDpiY ;
817+
818+ var newLeft = previousLeft * widthRatio * dpiXRatio ;
819+ var newTop = previousTop * heightRatio * dpiYRatio ;
820+
821+ var screenLeft = SystemParameters . VirtualScreenLeft ;
822+ var screenTop = SystemParameters . VirtualScreenTop ;
823+
824+ var maxX = screenLeft + screenWidth - ActualWidth ;
825+ var maxY = screenTop + screenHeight - ActualHeight ;
826+
827+ Left = Math . Max ( screenLeft , Math . Min ( newLeft , maxX ) ) ;
828+ Top = Math . Max ( screenTop , Math . Min ( newTop , maxY ) ) ;
829+ }
830+
831+ private void GetDpi ( out double dpiX , out double dpiY )
832+ {
833+ var source = PresentationSource . FromVisual ( this ) ;
834+ if ( source != null && source . CompositionTarget != null )
835+ {
836+ var matrix = source . CompositionTarget . TransformToDevice ;
837+ dpiX = 96 * matrix . M11 ;
838+ dpiY = 96 * matrix . M22 ;
839+ }
840+ else
841+ {
842+ dpiX = 96 ;
843+ dpiY = 96 ;
844+ }
845+ }
846+
778847 private Screen SelectedScreen ( )
779848 {
780849 Screen screen ;
@@ -835,6 +904,13 @@ private double HorizonLeft(Screen screen)
835904 return left ;
836905 }
837906
907+ public double VerticalTop ( Screen screen )
908+ {
909+ var dip1 = Win32Helper . TransformPixelsToDIP ( this , 0 , screen . WorkingArea . Y ) ;
910+ var top = dip1 . Y + 10 ;
911+ return top ;
912+ }
913+
838914 #endregion
839915
840916 #region Window Animation
@@ -1249,6 +1325,7 @@ protected virtual void Dispose(bool disposing)
12491325 _notifyIcon ? . Dispose ( ) ;
12501326 animationSoundWMP ? . Close ( ) ;
12511327 animationSoundWPF ? . Dispose ( ) ;
1328+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged ;
12521329 SystemEvents . PowerModeChanged -= SystemEvents_PowerModeChanged ;
12531330 }
12541331
0 commit comments