Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
 /// <summary>
 /// 位置とサイズを論理ピクセル値に変換します。
 /// </summary>
 /// <param name="rect">変換前の位置とサイズ</param>
 /// <returns>変換後の位置とサイズ</returns>
 public static Rectangle ToLogicalPixel(this Rectangle rect)
 {
     return(rect.ToLogicalPixel(PerMonitorDpi.GetDpi(rect)));
 }