Winform 限制窗体只能在屏幕内, 不能拖拽到屏幕外面

添加一个类文件"BaseForm.cs"

代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;

namespace WindowsFormsApp3
{
    public class BaseForm : Form
    {
        private Point _mouseDownPos;
        private bool _move;

        protected override void WndProc(ref Message m)
        {
            RECT nativeRect;
            switch (m.Msg)
            {
                case 0x20:
                    int lp = m.LParam.ToInt32();
                    if ((lp & 0xFFFF) == 2 &&
                    ((lp >> 0x10) & 0xFFFF) == 0x201)
                    {
                        _mouseDownPos = Control.MousePosition;
                        _move = true;
                    }
                    break;
                case 0x231:
                    if (_move)
                    {
                        Rectangle rect = Screen.GetWorkingArea(this);
                        nativeRect = new RECT(
                         _mouseDownPos.X - Location.X,
                         _mouseDownPos.Y - Location.Y,
                         rect.Right - (Bounds.Right - _mouseDownPos.X),
                         rect.Bottom - (Bounds.Bottom - _mouseDownPos.Y));
                        ClipCursor(ref nativeRect);
                    }
                    break;
                case 0x0232:
                    if (_move)
                    {
                        nativeRect = new RECT(Screen.GetWorkingArea(this));
                        ClipCursor(ref nativeRect);
                        _move = false;
                    }
                    break;
            }
            base.WndProc(ref m);
        }

        [DllImport("user32.dll")]
        public static extern bool ClipCursor(ref RECT lpRect);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;

            public RECT(int left, int top, int right, int bottom)
            {
                Left = left;
                Top = top;
                Right = right;
                Bottom = bottom;
            }

            public RECT(Rectangle rect)
            {
                Left = rect.Left;
                Top = rect.Top;
                Right = rect.Right;
                Bottom = rect.Bottom;
            }

            public Rectangle Rect
            {
                get
                {
                    return new Rectangle(
                    Left,
                    Top,
                    Right - Left,
                    Bottom - Top);
                }
            }

            public Size Size
            {
                get
                {
                    return new Size(Right - Left, Bottom - Top);
                }
            }

            public static RECT FromXYWH(int x, int y, int width, int height)
            {
                return new RECT(x,
                  y,
                  x + width,
                  y + height);
            }

            public static RECT FromRectangle(Rectangle rect)
            {
                return new RECT(rect.Left,
                   rect.Top,
                   rect.Right,
                   rect.Bottom);
            }
        }
    }
}


新建应用窗体"Form1.cs",继承"BaseForm"
    public partial class Form1 : BaseForm
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
调试运行,窗体只能在屏幕内部来回拖动,无法拖拽到屏幕外。


作者最新文章
C# 删除一维数组内的某个值(元素), C# 删除数组元素的方法
C# 如何判断一个字符串是否包含另一个字符串的方法,C# IndexOf 的使用
Winform 只能输入整数的TextBox (文本框) 控件
Winform 禁止重复启动,单实例exe程序
Winform TextBox (文本框) 控件禁止输入内容