惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
美团技术团队
Recent Announcements
Recent Announcements
B
Blog
GbyAI
GbyAI
雷峰网
雷峰网
博客园_首页
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tailwind CSS Blog
M
MIT News - Artificial intelligence
V
V2EX
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
L
LangChain Blog
Microsoft Security Blog
Microsoft Security Blog
宝玉的分享
宝玉的分享
A
About on SuperTechFans
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
Last Week in AI
Last Week in AI
aimingoo的专栏
aimingoo的专栏

博客园 - 彭旭

VNC远程Gnome图形桌面(openEuler 20.03 LTS系统) [WPF]控件应用多个样式 [ASP.NET MVC] Real-time之HTML5 服务器发送事件(server-sent event) [WCF]DomainServices客户端操作异常处理 [Silverlight]监听指定控件(FrameworkElement)的依赖属性(DependencyProperty)的更改 [Silverlight]键盘钩子KeyboardHook [Chrome扩展]屏蔽Google搜索结果重定向 Linq Distinct扩展 [WinForm] C#避免Panel(ScrollableControl)的子控件获取焦点时滚动条自动滚动 C#远程连接Oracle数据库(不安装客户端) RichTextBox.MouseWheel事件控制父控件Panel的内容滚动 ID3v1信息结构(MP3文件)的读取、修改(C#) 在线编辑Office文件 SQL优化 将自然数分解为若干连续的自然数 小写金额转换为大写金额 大数阶乘 查看文件夹大小及占用空间 VS2005开发WAP网站初识 - 彭旭 - 博客园
[Winform/C#]点击工作区域移动窗体
彭旭 · 2012-04-26 · via 博客园 - 彭旭

前言

话说鼠标点击客户区域实现移动窗体蛮简单的,目前有3种方法。

1.通过Form的MouseDown、MouseMove、MouseUp实现。这个逻辑比较简单就不介绍了。

2.通过Form的MouseDown事件里调用API。主要是调用ReleaseCapture()及SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0),WM_SYSCOMMAND=0x112、SC_MOVE=0xf010、HTCAPTION=0x2。大概是这样,有兴趣的可以试试。

3.重写WndProc函数,处理WM_NCHITTEST消息。

我是懒得用API,就选了第三种实现。

实现

先看代码,对WM_NCHITTEST消息有兴趣可以看看这里,以及MSDN

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    if (m.Msg == 0x84) //WM_NCHITTEST
    {
        m.Result = (IntPtr)2; //HTCAPTION
    }
}

问题1

坑爹的是,Form在无边框的时候,双击工作区就最大化,把屏幕的工具栏区域也覆盖了。

好吧,在构造函数里加句this.MaximumSize = Screen.PrimaryScreen.WorkingArea.Size;

问题2

最大化没问题了,但是你丫最大化了还能移动就太二了吧。

想想就只能在处理Windows消息之前把鼠标左键点击消息屏蔽了。

完整代码如下:

protected override void WndProc(ref Message m)
{
    if (this.Size.Equals(this.MaximumSize))
    {
        if (m.Msg == 0xA1) //WM_NCLBUTTONDOWN
            return;
    }
    base.WndProc(ref m);
    if (m.Msg == 0x84) //WM_NCHITTEST
    {
        m.Result = (IntPtr)2; //HTCAPTION
    }
}