在拖动'。
时,有一个名为'显示窗口内容的窗口显示设置http://www.thewindowsclub.com/disable-show-windows-contents-while-dragging
当此设置打开时,如果拖动窗口,窗口将立即重新显示在新位置。如果您调整窗口大小,它会立即为每个新窗口大小重新绘制窗口,即使您仍然按住鼠标按钮。
当设置关闭时,拖动窗口或调整窗口大小只会显示新窗口位置或大小的轮廓,直到您释放鼠标按钮然后它将窗口绘制到新位置或大小。
我想在我的C#WinForms应用程序中显示我的表单,其中显示窗口内容,同时拖动'设置已关闭。但是,由于这是一个操作设置,我只希望这在我的表单显示时有效,无论操作系统中的设置是什么。
有没有办法通过一些WinAPI调用来实现这一点,以专门为我的winforms改变行为?
如果没有,有没有办法可以在我的表单显示之前以编程方式更改设置,并在表单关闭后重置它?执行此更改是否需要管理员权限(因为我不想要这样做)?
答案 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;
}
}