From 83985aa44c3ac2feeadc4159c3d8826341b6cef5 Mon Sep 17 00:00:00 2001 From: Boris Makogonyuk Date: Sun, 13 Dec 2015 04:22:01 +0100 Subject: [PATCH] Added Pixel to Device Independent Pixel transformation to WindowIntelopHelper MainWindow GetWindowsTop and GetWindowsLeft will use DIP when searching for the center of the screen --- Wox/Helper/WindowIntelopHelper.cs | 28 ++++++++++++++++++++++++++++ Wox/MainWindow.xaml.cs | 31 ++++++++++--------------------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/Wox/Helper/WindowIntelopHelper.cs b/Wox/Helper/WindowIntelopHelper.cs index 4a0223a19e..a61665b54d 100644 --- a/Wox/Helper/WindowIntelopHelper.cs +++ b/Wox/Helper/WindowIntelopHelper.cs @@ -4,6 +4,8 @@ using System.Runtime.InteropServices; using System.Windows; using System.Windows.Forms; using System.Windows.Interop; +using System.Windows.Media; +using Point = System.Windows.Point; namespace Wox.Helper { @@ -80,6 +82,32 @@ namespace Wox.Helper SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU); } + /// + /// Transforms pixels to Device Independent Pixels used by WPF + /// + /// current window, required to get presentation source + /// horizontal position in pixels + /// vertical position in pixels + /// point containing device independent pixels + public static Point TransformPixelsToDIP(Visual visual, double unitX, double unitY) + { + Matrix matrix; + var source = PresentationSource.FromVisual(visual); + if (source != null) + { + matrix = source.CompositionTarget.TransformFromDevice; + } + else + { + using (var src = new HwndSource(new HwndSourceParameters())) + { + matrix = src.CompositionTarget.TransformFromDevice; + } + } + return new Point((int) (matrix.M11*unitX), (int) (matrix.M22*unitY)); + } + + [StructLayout(LayoutKind.Sequential)] public struct RECT { diff --git a/Wox/MainWindow.xaml.cs b/Wox/MainWindow.xaml.cs index aef06b9eb5..dde25ebdba 100644 --- a/Wox/MainWindow.xaml.cs +++ b/Wox/MainWindow.xaml.cs @@ -260,34 +260,21 @@ namespace Wox private double GetWindowsLeft() { - var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); - if (UserSettingStorage.Instance.RememberLastLaunchLocation) - { - var origScreen = Screen.FromRectangle(new Rectangle((int)Left, (int)Top, (int)ActualWidth, (int)ActualHeight)); - var coordX = (Left - origScreen.WorkingArea.Left) / (origScreen.WorkingArea.Width - ActualWidth); - UserSettingStorage.Instance.WindowLeft = (screen.WorkingArea.Width - ActualWidth) * coordX + screen.WorkingArea.Left; - } - else - { - UserSettingStorage.Instance.WindowLeft = (screen.WorkingArea.Width - ActualWidth) / 2 + screen.WorkingArea.Left; - } + if (UserSettingStorage.Instance.RememberLastLaunchLocation) return UserSettingStorage.Instance.WindowLeft; + var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); + var dipPoint = WindowIntelopHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0); + UserSettingStorage.Instance.WindowLeft = (dipPoint.X - ActualWidth)/2; return UserSettingStorage.Instance.WindowLeft; } private double GetWindowsTop() { + if (UserSettingStorage.Instance.RememberLastLaunchLocation) return UserSettingStorage.Instance.WindowTop; + var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); - if (UserSettingStorage.Instance.RememberLastLaunchLocation) - { - var origScreen = Screen.FromRectangle(new Rectangle((int)Left, (int)Top, (int)ActualWidth, (int)ActualHeight)); - var coordY = (Top - origScreen.WorkingArea.Top) / (origScreen.WorkingArea.Height - ActualHeight); - UserSettingStorage.Instance.WindowTop = (screen.WorkingArea.Height - ActualHeight) * coordY + screen.WorkingArea.Top; - } - else - { - UserSettingStorage.Instance.WindowTop = (screen.WorkingArea.Height - tbQuery.ActualHeight) / 4 + screen.WorkingArea.Top; - } + var dipPoint = WindowIntelopHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height); + UserSettingStorage.Instance.WindowTop = (dipPoint.Y - tbQuery.ActualHeight)/4; return UserSettingStorage.Instance.WindowTop; } @@ -534,6 +521,8 @@ namespace Wox private void HideWox() { + UserSettingStorage.Instance.WindowLeft = Left; + UserSettingStorage.Instance.WindowTop = Top; if (IsInContextMenuMode) { BackToResultMode();