在显示我的 C# windows 表单时关闭 'Show window contents while dragging' 设置

Turn off 'Show window contents while dragging' setting while displaying my C# windows forms

有一个名为 'Show window contents while dragging' 的 window 显示设置。

http://www.thewindowsclub.com/disable-show-windows-contents-while-dragging

启用此设置后,如果您拖动 window,window 将立即在新位置重新绘制。如果您调整 window 的大小,它会立即为每个新的 window 大小重新绘制 window,即使您仍然按住鼠标按钮也是如此。

关闭设置后,拖动 window 或调整 window 的大小只会显示新 window 位置或大小的轮廓,直到您松开鼠标按钮,然后它才会绘制 window 在新的位置或大小。

我想在 'Show window contents while dragging' 设置关闭的情况下在我的 C# WinForms 应用程序中显示我的表单。然而,由于这是一个操作设置,我只希望它在显示我的表单时有效,而不管 OS.

中的设置是什么

有没有一种方法可以使用一些 WinAPI 调用来专门针对我的 winform 更改行为?

如果没有,有没有一种方法可以在我的表单显示之前以编程方式更改设置并在我的表单关闭后重置它?执行此更改是否需要管理员权限(因为我不想要)?

下面的代码会使用系统设置的'Show window content while dragging'进行window重新定位,同时会暂时设置为关闭,同时调整window的大小,然后设置回到系统设置。

这使您可以在 windows 表格中自由调整表格大小。

由于此 属性 是修改 HKEY_CURRENT_USER\Control Panel\Desktop\DragFullWindows 注册表项的用户设置,因此它不需要管理员权限。

    [DllImport("user32.dll", EntryPoint = "SystemParametersInfo", CharSet = CharSet.Auto)]
    public static extern int GetSystemParametersInfo(int uAction, int uParam, out int lpvParam, int fuWinIni);

    [DllImport("user32.dll", EntryPoint = "SystemParametersInfo", CharSet = CharSet.Auto)]
    public static extern int SetSystemParametersInfo(int uAction, int uParam, int lpvParam, int fuWinIni);

    private const int SPI_GETDRAGFULLWINDOWS = 38;
    private const int SPI_SETDRAGFULLWINDOWS = 37;

    private const int WM_SYSCOMMAND = 0x0112;
    private const int SC_SIZE = 0xF000; 

    //change 'Show window content while dragging' to false while resizing
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_SYSCOMMAND && (m.WParam.ToInt32() & 0xfff0) == SC_SIZE)
        {
            int isDragFullWindow;
            GetSystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, out isDragFullWindow, 0);

            if (isDragFullWindow != 0)
                SetSystemParametersInfo(SPI_SETDRAGFULLWINDOWS, 0, 0, 0);

            base.WndProc(ref m);

            if (isDragFullWindow != 0)
                SetSystemParametersInfo(SPI_SETDRAGFULLWINDOWS, 1, 0, 0);
        }
        else
        {
            base.WndProc(ref m);
        }
    } 

    //reduce control flickering and black stripes when window is resized
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
            return cp;
        }
    }