/// <summary> /// 指定ウィンドウハンドルのウィンドウサイズを取得します。 /// </summary> /// <param name="handle">ウィンドウハンドル</param> /// <param name="isHighDpi">高DPI対応を処理するかどうか</param> /// <returns>ウィンドウサイズ</returns> public static Rectangle GetWindowSize(IntPtr handle, bool isHighDpi = true) { try { var result = GetWindowSize(handle); if (result != Rectangle.Empty) { // 最大化状態のウィンドウの場合 var style = User32.GetWindowLong(handle, GWL.STYLE); if ((style & (int)WS.MAXIMIZE) == (int)WS.MAXIMIZE) { // スクリーン取得 var point = new Point( result.Left + result.Width / 2, result.Top + result.Height / 2); var screen = Screen.AllScreens .Where(x => x.Bounds.Contains(point)) .FirstOrDefault(); // スクリーンの作業領域を設定する if (screen != null) { result = screen.WorkingArea; } } // 高DPI対応 if (isHighDpi) { result = result.ToLogicalPixel(PerMonitorDpi.GetDpi(handle)); } } return(result); } catch (Exception) { return(Rectangle.Empty); } }
/// <summary> /// 位置とサイズを論理ピクセル値に変換します。 /// </summary> /// <param name="rect">変換前の位置とサイズ</param> /// <returns>変換後の位置とサイズ</returns> public static Rectangle ToLogicalPixel(this Rectangle rect) { return(rect.ToLogicalPixel(PerMonitorDpi.GetDpi(rect))); }