转载:http://blog.csdn.net/dxsh126/article/details/2940226

首先,要用到一个WimdowsAPI函数,因此必须引入 
using System.Runtime.InteropServices; 
命名空间;

然后,这里有两种方法,一种使用API, 一种不用,重写WndProc窗口过程的方式不需要API函数。另一个方法需要两个: 
SendMessage 像指定窗口过程发送消息 
ReleaseCapture 释放鼠标捕获

最后是一些必要的常数声明,这些声明可以在MSDN或者CPP头文件中找到: 
private const int WM_SYSCOMMAND = 0x0112;//点击窗口左上角那个图标时的系统信息 
private const int SC_MOVE = 0xF010;//移动信息 
private const int HTCAPTION = 0x0002;//表示鼠标在窗口标题栏时的系统信息 
private const int WM_NCHITTEST = 0x84;//鼠标在窗体客户区(除了标题栏和边框以外的部分)时发送的消息 
private const int HTCLIENT = 0x1;//表示鼠标在窗口客户区的系统消息 
private const int SC_MAXIMIZE = 0xF030;//最大化信息 
private const int SC_MINIMIZE = 0xF020;//最小化信息

Here we go。

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

namespace WindowsApplicationTestNoBoarderAndMove 

public partial class Form1 : Form 

public Form1() 

InitializeComponent(); 
}

[DllImport("user32.dll")] 
public static extern bool ReleaseCapture();

[DllImport("user32.dll")] 
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

private const int WM_SYSCOMMAND = 0x0112;//点击窗口左上角那个图标时的系统信息 
private const int SC_MOVE = 0xF010;//移动信息 
private const int HTCAPTION = 0x0002;//表示鼠标在窗口标题栏时的系统信息 
private const int WM_NCHITTEST = 0x84;//鼠标在窗体客户区(除了标题栏和边框以外的部分)时发送的消息 
private const int HTCLIENT = 0x1;//表示鼠标在窗口客户区的系统消息 
private const int SC_MAXIMIZE = 0xF030;//最大化信息 
private const int SC_MINIMIZE = 0xF020;//最小化信息

private void closeToolStripMenuItem_Click(object sender, EventArgs e) 

Application.Exit(); 
}

//下面的代码我用//注释了一下,这是两种实现方法

//private void Form1_MouseDown(object sender, MouseEventArgs e) 
//{ 
// ReleaseCapture();//首先释放鼠标焦点捕获,这样就不会再发出WM_NCHITTEST消息 
// SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);//然后向当前窗体发送消息,消息是移动+表示鼠标在标题栏上 
//}

//如果用这种重写的方法,就把上面的部分注释掉……

/**/ 
protected override void WndProc(ref Message m) 

switch (m.Msg) 

case WM_SYSCOMMAND: 
if (m.WParam == (IntPtr)SC_MAXIMIZE) 

m.WParam = (IntPtr)SC_MINIMIZE; 

break; 
case WM_NCHITTEST: //如果鼠标移动或单击 
base.WndProc(ref m);//调用基类的窗口过程——WndProc方法处理这个消息 
if (m.Result == (IntPtr)HTCLIENT)//如果返回的是HTCLIENT 

m.Result = (IntPtr)HTCAPTION;//把它改为HTCAPTION 
return;//直接返回退出方法 

break; 

base.WndProc(ref m);//如果不是鼠标移动或单击消息就调用基类的窗口过程进行处理 
}

//用后面这个重写的方法有个问题~~~ 
//你猜,如果你在窗体上双击鼠标,会发生什么?呵呵,窗体会最大化…… 

}

转载:http://blog.csdn.net/dxsh126/article/details/2940226

c#无边窗体实现移动的两种方式的更多相关文章

  1. Android开发之使用sqlite3工具操作数据库的两种方式

    使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...

  2. Struts2实现ajax的两种方式

    基于Struts2框架下实现Ajax有两种方式,第一种是原声的方式,另外一种是struts2自带的一个插件. js部分调用方式是一样的: JS代码: function testAjax() { var ...

  3. CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking)

    CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking) 我在(Modern OpenGL用Shader拾取 ...

  4. 两种方式实现java生成Excel

    Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...

  5. Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)

    Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...

  6. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

  7. (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步

    最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...

  8. 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  9. Xamarin Android Activity全屏的两种方式

    方式一 直接在Activity的Attribute中定义 如下 在 MainActivity 中 [Activity(Label = "app", MainLauncher = t ...

随机推荐

  1. sql语句_2

    数据表如下 一个user_id对应多个user_name,现在要求是:如果某个用户对应的user_name中存在一个a,打印user_id,a出来:如果不存在,打印user_id,0.打印时候user ...

  2. 一次对webshell的后门的查看

    本文作者i春秋作家——非主流 昨天晚上突发奇想的想去看看github上面tennc的webshell收集项目中的shell有没有漏洞,比如未授权啊啥的,结果找半天都没找到...但是机缘巧合下,居然给我 ...

  3. ansj分词史上最详细教程

    最近的项目需要使用到分词技术.本着不重复造轮子的原则,使用了ansj_seg来进行分词.本文结合博主使用经过,教大家用最快的速度上手使用ansj分词. 1.给ansj来个硬广 项目的github地址: ...

  4. jQuery.extend 函数

    jQuery.extend 函数详解 JQuery的extend扩展方法: Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解. 一.J ...

  5. centos7在分区上建立文件系统和挂载

    在上一篇博客中,我们只说了硬盘的分区,既然进行分区,那么我们就要知道如何使用这些分区,就是接下来的建立文件系统和挂载. mkfs(make filesystem)格式化,建立文件系统 可以看到各种文件 ...

  6. linux安装应用程序

    实验:为 Linux 主机安装应用程序   环境:vmware workstation 14  . redhad-server-6.4 需求:1.使用 RPM 包的方式安装 Mozilla Firef ...

  7. OS之进程管理 --- 死锁

    什么是死锁 在正常操作模式下,进程按如下顺序来使用资源: 申请:进程请求资源 使用:进程对资源进行操作 释放:进程释放资源 当一组进程中的每一个进程度在等待一个事件,而这事件只能有一组进程的另一个进程 ...

  8. Scala 中的foreach和map方法比较

    Scala中的集合对象都有foreach和map两个方法.两个方法的共同点在于:都是用于遍历集合对象,并对每一项执行指定的方法.而两者的差异在于:foreach无返回值(准确说返回void),map返 ...

  9. (转)Python科学计算之Pandas详解,pythonpandas

    https://www.cnblogs.com/linux-wangkun/p/5903380.html-------pandas 学习(1): pandas 数据结构之Series https:// ...

  10. 第7章—SpringMVC高级技术—不用web.xml,而使用java类配置SpringMVC

    不用web.xml,而使用java类配置SpringMVC DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置 ...