198366809 发表于 2021-8-19 19:27:44

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);
      }

      
      public static extern bool ClipCursor(ref RECT lpRect);

      
      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#社区原文:https://www.hicsharp.com/a/0c2ee4aded234c8fa023c9f751a57061​

chen3721 发表于 2021-8-19 19:27:44

绝对干货,楼主给力,支持了!!!

lifeng50558 发表于 2021-8-19 19:53:42

真是被感动的痛哭流涕……

祥熙 发表于 2021-8-20 09:46:23

强烈支持楼主ing……

wzhiq 发表于 2025-11-18 18:30:05

原来还有这种操作,长见识了!

气温阿 发表于 2025-11-18 18:34:45

蹲一波同款,有没有姐妹 / 兄弟推荐?

张键 发表于 2025-11-18 18:36:04

水个经验,支持楼主,加油呀

maoshengjms 发表于 2025-11-18 18:36:21

评论区人才辈出,笑到停不下来😂

wjjwjf521 发表于 2025-11-18 18:37:37

赞同 + 10086,没毛病,完全没毛病

海。涛 发表于 2025-11-18 18:39:14

谁懂啊!真的被戳中笑点 / 泪点了
页: [1] 2
查看完整版本: Winform 限制窗体只能在屏幕内, 不能拖拽到屏幕外面