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

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
U
Unit 42
B
Blog RSS Feed
博客园 - 【当耐特】
T
Tailwind CSS Blog
V
V2EX
S
SegmentFault 最新的问题
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
量子位
aimingoo的专栏
aimingoo的专栏
Stack Overflow Blog
Stack Overflow Blog
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
P
Proofpoint News Feed
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
About on SuperTechFans

博客园 - 彭旭

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