在拖动'时关闭'显示窗口内容在显示我的C#窗体时进行设置

时间:2015-04-09 20:36:30

标签: c# winforms winapi resize

在拖动'。

时,有一个名为'显示窗口内容的窗口显示设置

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

当此设置打开时,如果拖动窗口,窗口将立即重新显示在新位置。如果您调整窗口大小,它会立即为每个新窗口大小重新绘制窗口,即使您仍然按住鼠标按钮。

当设置关闭时,拖动窗口或调整窗口大小只会显示新窗口位置或大小的轮廓,直到您释放鼠标按钮然后它将窗口绘制到新位置或大小。

我想在我的C#WinForms应用程序中显示我的表单,其中显示窗口内容,同时拖动'设置已关闭。但是,由于这是一个操作设置,我只希望这在我的表单显示时有效,无论操作系统中的设置是什么。

有没有办法通过一些WinAPI调用来实现这一点,以专门为我的winforms改变行为?

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

1 个答案:

答案 0 :(得分:1)

下面的代码将使用“拖动显示窗口内容”的系统设置'用于窗口重新定位,同时将临时将其设置为关闭,同时调整窗口大小,然后将其重新设置为系统设置。

这为您提供了在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;
        }
    }