C# 重寫鼠標移動窗體事件
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;
<summary>
重寫WndProc方法,實現窗體移動和禁止雙擊最大化
</summary>
<param name="m">Windows 消息</param>
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x4e:
case 0xd:
case 0xe:
case 0x14:
base.WndProc(ref m);
break;
case 0x84://鼠標點任意位置后可以拖動窗體
this.DefWndProc(ref m);
if (m.Result.ToInt32() == 0x01)
{
m.Result = new IntPtr(0x02);
}
break;
case 0xA3://禁止雙擊最大化
break;
default:
base.WndProc(ref m);
break;
}
}
private void ribbonControl1_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
private void MainForm_Resize(object sender, EventArgs e)
{
Region region = null;
switch (this.WindowState)
{
case FormWindowState.Maximized:
region = new Region(this.ClientRectangle);
break;
case FormWindowState.Normal:
using (GraphicsPath path = new GraphicsPath())
{
int r = 16;
path.AddArc(0, 0, r, r, 180, 90);
path.AddArc(this.Width - r - 1, 0, r, r, 270, 90);
path.AddArc(this.Width - r - 1, this.Height - r - 1, r, r, 0, 90);
path.AddArc(0, this.Height - r - 1, r, r, 90, 90);
region = new Region(path);
}
break;
default:
return;
}
this.Region = region;
}