@@ -711,8 +711,26 @@ void InitializePositionInner()
711
711
{
712
712
if ( _settings . SearchWindowScreen == SearchWindowScreens . RememberLastLaunchLocation )
713
713
{
714
- Top = _settings . WindowTop ;
714
+ var previousScreenWidth = _settings . PreviousScreenWidth ;
715
+ var previousScreenHeight = _settings . PreviousScreenHeight ;
716
+ GetDpi ( out var previousDpiX , out var previousDpiY ) ;
717
+
718
+ _settings . PreviousScreenWidth = SystemParameters . VirtualScreenWidth ;
719
+ _settings . PreviousScreenHeight = SystemParameters . VirtualScreenHeight ;
720
+ GetDpi ( out var currentDpiX , out var currentDpiY ) ;
721
+
722
+ if ( previousScreenWidth != 0 && previousScreenHeight != 0 &&
723
+ previousDpiX != 0 && previousDpiY != 0 &&
724
+ ( previousScreenWidth != SystemParameters . VirtualScreenWidth ||
725
+ previousScreenHeight != SystemParameters . VirtualScreenHeight ||
726
+ previousDpiX != currentDpiX || previousDpiY != currentDpiY ) )
727
+ {
728
+ AdjustPositionForResolutionChange ( ) ;
729
+ return ;
730
+ }
731
+
715
732
Left = _settings . WindowLeft ;
733
+ Top = _settings . WindowTop ;
716
734
}
717
735
else
718
736
{
@@ -725,27 +743,73 @@ void InitializePositionInner()
725
743
break ;
726
744
case SearchWindowAligns . CenterTop :
727
745
Left = HorizonCenter ( screen ) ;
728
- Top = 10 ;
746
+ Top = VerticalTop ( screen ) ;
729
747
break ;
730
748
case SearchWindowAligns . LeftTop :
731
749
Left = HorizonLeft ( screen ) ;
732
- Top = 10 ;
750
+ Top = VerticalTop ( screen ) ;
733
751
break ;
734
752
case SearchWindowAligns . RightTop :
735
753
Left = HorizonRight ( screen ) ;
736
- Top = 10 ;
754
+ Top = VerticalTop ( screen ) ;
737
755
break ;
738
756
case SearchWindowAligns . Custom :
739
- Left = Win32Helper . TransformPixelsToDIP ( this ,
740
- screen . WorkingArea . X + _settings . CustomWindowLeft , 0 ) . X ;
741
- Top = Win32Helper . TransformPixelsToDIP ( this , 0 ,
742
- screen . WorkingArea . Y + _settings . CustomWindowTop ) . Y ;
757
+ var customLeft = Win32Helper . TransformPixelsToDIP ( this ,
758
+ screen . WorkingArea . X + _settings . CustomWindowLeft , 0 ) ;
759
+ var customTop = Win32Helper . TransformPixelsToDIP ( this , 0 ,
760
+ screen . WorkingArea . Y + _settings . CustomWindowTop ) ;
761
+ Left = customLeft . X ;
762
+ Top = customTop . Y ;
743
763
break ;
744
764
}
745
765
}
746
766
}
747
767
}
748
768
769
+ private void AdjustPositionForResolutionChange ( )
770
+ {
771
+ var screenWidth = SystemParameters . VirtualScreenWidth ;
772
+ var screenHeight = SystemParameters . VirtualScreenHeight ;
773
+ GetDpi ( out var currentDpiX , out var currentDpiY ) ;
774
+
775
+ var previousLeft = _settings . WindowLeft ;
776
+ var previousTop = _settings . WindowTop ;
777
+ GetDpi ( out var previousDpiX , out var previousDpiY ) ;
778
+
779
+ var widthRatio = screenWidth / _settings . PreviousScreenWidth ;
780
+ var heightRatio = screenHeight / _settings . PreviousScreenHeight ;
781
+ var dpiXRatio = currentDpiX / previousDpiX ;
782
+ var dpiYRatio = currentDpiY / previousDpiY ;
783
+
784
+ var newLeft = previousLeft * widthRatio * dpiXRatio ;
785
+ var newTop = previousTop * heightRatio * dpiYRatio ;
786
+
787
+ var screenLeft = SystemParameters . VirtualScreenLeft ;
788
+ var screenTop = SystemParameters . VirtualScreenTop ;
789
+
790
+ var maxX = screenLeft + screenWidth - ActualWidth ;
791
+ var maxY = screenTop + screenHeight - ActualHeight ;
792
+
793
+ Left = Math . Max ( screenLeft , Math . Min ( newLeft , maxX ) ) ;
794
+ Top = Math . Max ( screenTop , Math . Min ( newTop , maxY ) ) ;
795
+ }
796
+
797
+ private void GetDpi ( out double dpiX , out double dpiY )
798
+ {
799
+ var source = PresentationSource . FromVisual ( this ) ;
800
+ if ( source != null && source . CompositionTarget != null )
801
+ {
802
+ var matrix = source . CompositionTarget . TransformToDevice ;
803
+ dpiX = 96 * matrix . M11 ;
804
+ dpiY = 96 * matrix . M22 ;
805
+ }
806
+ else
807
+ {
808
+ dpiX = 96 ;
809
+ dpiY = 96 ;
810
+ }
811
+ }
812
+
749
813
private Screen SelectedScreen ( )
750
814
{
751
815
Screen screen ;
@@ -806,6 +870,13 @@ private double HorizonLeft(Screen screen)
806
870
return left ;
807
871
}
808
872
873
+ public double VerticalTop ( Screen screen )
874
+ {
875
+ var dip1 = Win32Helper . TransformPixelsToDIP ( this , 0 , screen . WorkingArea . Y ) ;
876
+ var top = dip1 . Y + 10 ;
877
+ return top ;
878
+ }
879
+
809
880
#endregion
810
881
811
882
#region Window Animation
0 commit comments