转载: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. 使用git时出现Please make sure you have the correct access rights and the repository exists.问题已解决。

    使用git时,出现Please make sure you have the correct access rights and the repository exists.问题已解决. 今天我在使用 ...

  2. 【9】JMicro微服务-发布订阅消息服务

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...

  3. 【LeetCode】 617. 合并二叉树

    题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否 ...

  4. Delphi获取IdHTTP1.Get(url)的返回参数

    var   ss: TStringStream; begin   ss := TStringStream.Create('');   idHTTP1.get(url, ss);   ss.Positi ...

  5. linux传输文件命令: rz 和 sz

    参考: https://www.cnblogs.com/xiluhua/p/6218563.html https://blog.csdn.net/u014242496/article/details/ ...

  6. SPSS学习系列之SPSS Text Analytics是什么?

    不多说,直接上干货! IBM® SPSS® Text Analytics 是一个IBM® SPSS® Modeler 完全集成内插式插件,它采用了先进语言技术和Natural Language Pro ...

  7. PCI配置空间简介

    一.PCI配置空间简介 PCI有三个相互独立的物理地址空间:设备存储器地址空间.I/O地址空间和配置空间.配置空间是PCI所特有的一个物理空间.由于PCI支持设备即插即用,所以PCI设备不占用固定的内 ...

  8. java的日期格式化

    原博客地址: http://blog.csdn.net/yangbobo1992/article/details/9965105 日期格式: 时间日期标识符: yyyy:年 MM:月 dd:日 hh: ...

  9. 术语CDATA,其实可以理解为一种特殊的转移字符

    参考:http://www.w3school.com.cn/xml/xml_cdata.asp 常见于XML文档,所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(Charact ...

  10. 推荐的bootstrap之 formgroup表单布局样式

    一直没能找到比较好的Form Group样式,直到找到如下样式 转自 https://www.cnblogs.com/jokerjason/p/5721349.html <form class= ...