Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
368 views
in Technique[技术] by (71.8m points)

winforms - C# want to restrict where a form can be moved to

I am trying to restrict where a form can be moved to on the desktop. Basically I don't want them to be able to move the form off the desktop. I found a bunch of SetBounds functions but they seem to do something that seems very odd to me for the names of the functions and aren't serving my purpose.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I realize you are not interested in an answer anymore, I'll post a solution anyway. You want to handle the WM_MOVING message and override the target position. Beware that it has side-effects on Win7 and is inadvisable if the user has more than one monitor. Mouse position handling isn't great either. The code:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }
    protected override void WndProc(ref Message m) {
      if (m.Msg == 0x216) { // Trap WM_MOVING
        RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
        Screen scr = Screen.FromRectangle(Rectangle.FromLTRB(rc.left, rc.top, rc.right, rc.bottom));
        if (rc.left < scr.WorkingArea.Left) {rc.left = scr.WorkingArea.Left; rc.right = rc.left + this.Width; }
        if (rc.top < scr.WorkingArea.Top) { rc.top = scr.WorkingArea.Top; rc.bottom = rc.top + this.Height; }
        if (rc.right > scr.WorkingArea.Right) { rc.right = scr.WorkingArea.Right; rc.left = rc.right - this.Width; }
        if (rc.bottom > scr.WorkingArea.Bottom) { rc.bottom = scr.WorkingArea.Bottom; rc.top = rc.bottom - this.Height; }
        Marshal.StructureToPtr(rc, m.LParam, false);
      }
      base.WndProc(ref m);
    }
    private struct RECT {
      public int left; 
      public int top; 
      public int right; 
      public int bottom; 
    }
  }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...