@@ -91,7 +91,7 @@ public MainWindow()
91
91
92
92
InitSoundEffects ( ) ;
93
93
DataObject . AddPastingHandler ( QueryTextBox , QueryTextBox_OnPaste ) ;
94
-
94
+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged ;
95
95
SystemEvents . PowerModeChanged += SystemEvents_PowerModeChanged ;
96
96
}
97
97
@@ -101,6 +101,11 @@ public MainWindow()
101
101
102
102
#pragma warning disable VSTHRD100 // Avoid async void methods
103
103
104
+ private void ThemeManager_ActualApplicationThemeChanged ( ModernWpf . ThemeManager sender , object args )
105
+ {
106
+ _theme . RefreshFrameAsync ( ) ;
107
+ }
108
+
104
109
private void OnSourceInitialized ( object sender , EventArgs e )
105
110
{
106
111
var handle = Win32Helper . GetWindowHandle ( this , true ) ;
@@ -716,8 +721,26 @@ void InitializePositionInner()
716
721
{
717
722
if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
718
723
{
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
+
720
742
Left = _settings . WindowLeft ;
743
+ Top = _settings . WindowTop ;
721
744
}
722
745
else
723
746
{
@@ -730,27 +753,73 @@ void InitializePositionInner()
730
753
break ;
731
754
case SearchWindowAligns . CenterTop :
732
755
Left = HorizonCenter ( screen ) ;
733
- Top = 10 ;
756
+ Top = VerticalTop ( screen ) ;
734
757
break ;
735
758
case SearchWindowAligns . LeftTop :
736
759
Left = HorizonLeft ( screen ) ;
737
- Top = 10 ;
760
+ Top = VerticalTop ( screen ) ;
738
761
break ;
739
762
case SearchWindowAligns . RightTop :
740
763
Left = HorizonRight ( screen ) ;
741
- Top = 10 ;
764
+ Top = VerticalTop ( screen ) ;
742
765
break ;
743
766
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 ;
748
773
break ;
749
774
}
750
775
}
751
776
}
752
777
}
753
778
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
+
754
823
private Screen SelectedScreen ( )
755
824
{
756
825
Screen screen ;
@@ -811,6 +880,13 @@ private double HorizonLeft(Screen screen)
811
880
return left ;
812
881
}
813
882
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
+
814
890
#endregion
815
891
816
892
#region Window Animation
@@ -1185,6 +1261,7 @@ protected virtual void Dispose(bool disposing)
1185
1261
_notifyIcon ? . Dispose ( ) ;
1186
1262
animationSoundWMP ? . Close ( ) ;
1187
1263
animationSoundWPF ? . Dispose ( ) ;
1264
+ ModernWpf . ThemeManager . Current . ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged ;
1188
1265
SystemEvents . PowerModeChanged -= SystemEvents_PowerModeChanged ;
1189
1266
}
1190
1267
0 commit comments