メモ C# 正確なFormサイズが取得できない
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

メモ C# 正確なFormサイズが取得できない

2017-04-07 18:33
    [Q]
    Form.Boundsの値が実際に表示されるサイズと違う。

    [A]
    Windows10はForm.BoundsやGetWindowRectでは実際に表示されているサイズを返さない。DwmGetWindowAttributeを使う。ただし、クラシックモードの場合はGetWindowRectを使う。



    using System;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowBountsTest
    {
    public partial class Form1 : Form
    {
    enum DWMWINDOWATTRIBUTE : uint
    {
    NCRenderingEnabled = 1,
    NCRenderingPolicy,
    TransitionsForceDisabled,
    AllowNCPaint,
    CaptionButtonBounds,
    NonClientRtlLayout,
    ForceIconicRepresentation,
    Flip3DPolicy,
    ExtendedFrameBounds,
    HasIconicBitmap,
    DisallowPeek,
    ExcludedFromPeek,
    Cloak,
    Cloaked,
    FreezeRepresentation
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
    public int left;
    public int top;
    public int right;
    public int bottom;
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

    [DllImport("dwmapi.dll")]
    static extern int DwmGetWindowAttribute(IntPtr hwnd, DWMWINDOWATTRIBUTE dwAttribute, out RECT pvAttribute, int cbAttribute);

    public Form1()
    {
    InitializeComponent();
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
    var rect1 = new RECT();
    GetWindowRect(Handle, out rect1);

    var rect2 = new RECT();
    DwmGetWindowAttribute(Handle, DWMWINDOWATTRIBUTE.ExtendedFrameBounds, out rect2, Marshal.SizeOf(rect2));

    var sb = new StringBuilder();
    sb.AppendLine("Form.Bounds");
    sb.AppendLine($"X={Bounds.X},Y={Bounds.Y},Width={Bounds.Width},Height={Bounds.Height}");
    sb.AppendLine();
    sb.AppendLine("GetWindowRect");
    sb.AppendLine($"X={rect1.left},Y={rect1.top},Width={rect1.right - rect1.left},Height={rect1.bottom - rect1.top}");
    sb.AppendLine();
    sb.AppendLine("DwmGetWindowAttribute");
    sb.AppendLine($"X={rect2.left},Y={rect2.top},Width={rect2.right - rect2.left},Height={rect2.bottom - rect2.top}");

    label1.Text = sb.ToString();
    }
    }
    }
    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。