0%

关于C# 无边框窗体的拖拽实现

每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为: 窗口句柄(Window Handle) HWND, 消息ID(Message ID) UINT, 和两个消息参数(wParam, lParam)WPARAM、LPARAM, WndProc的第一个参数hWnd就是当前接收消息的窗口句柄,第二个参数就是被传送过来的消息,第三、第四个参数都是附加在消息上的数据,这和MSG结构体是一样的。 代码如下:

//窗口拖拽
protected override void WndProc(ref Message m)
{
const int WM_NCHITTEST = 0x84;
const int HTCLIENT = 0x01;
const int HTCAPTION = 0x02;
const int WM_NCLBUTTONDBLCLK = 0xA3;
switch (m.Msg)
{
case 0x4e:
case 0xd:
case 0xe:
case 0x14:
base.WndProc(ref m);
break;
case WM_NCHITTEST://鼠标点任意位置后可以拖动窗体

this.DefWndProc(ref m);
if (m.Result.ToInt32() == HTCLIENT)
{
m.Result = new IntPtr(HTCAPTION);
return;
}
break;
case WM_NCLBUTTONDBLCLK://禁止双击最大化
Console.WriteLine(this.WindowState);

return;

default:

base.WndProc(ref m);
break;
}
}

亦或者可以使用其它方法 比如窗口鼠标点击事件和移动事件。 ~ PS: 其实我就是想看看代码插件效果