原文:C#句柄使用

调用 API 函数 SendMessage 发送 WM_CLOSE 消息。



DllImport("User32.dll",EntryPoint="SendMessage")]

private static extern int SendMessage( int
hWnd,int Msg,int wParam,int lParam);



const int WM_CLOSE = 0x10;

SendMessage(那个程序的窗口句柄, WM_CLOSE, 0, 0);



可以用 IntPtr 代替 int 数据类型

在Visual C# 2005中如何实现窗口任意处移动窗口

首先,要用到一个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);//如果不是鼠标移动或单击消息就调用基类的窗口过程进行处理

       
}





       
//用后面这个重写的方法有个问题~~~

       
//你猜,如果你在窗体上双击鼠标,会发生什么?呵呵,窗体会最大化……

    }

}

C#句柄使用的更多相关文章

  1. JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)

    1.事件冒泡与事件捕获 2.事件与事件句柄   3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处:     1.每个函 ...

  2. Nodejs事件引擎libuv源码剖析之:句柄(handle)结构的设计剖析

    声明:本文为原创博文,转载请注明出处. 句柄(handle)代表一种对持有资源的索引,句柄的叫法在window上较多,在unix/linux等系统上大多称之为描述符,为了抽象不同平台的差异,libuv ...

  3. C#根据句柄改变窗体控件值

    需求是这样,有个程序界面我们需要通过自己的程序持续输入数据,界面如图. 可以获得控件的句柄而用钩子写入值.这里需要用到spy++工具.在VS的工具下有个spy++工具,打开如下图 通过这个工具可以获得 ...

  4. .NET对象与Windows句柄(一):句柄的基本概念

    在.NET编程中,得益于有效的内存管理机制,对象的创建和使用比较方便,大多数情况下我们无须关心对象创建和分配内存的细节,也可以放心的把对象的清理交给自动垃圾回收来完成.由于.NET类库对系统底层对象进 ...

  5. 源码剖析——深入Windows句柄本质

    参考资料: 1. http://www.codeforge.cn/read/146318/WinDef.h__html windef.h头文件 2. http://www.codeforge.cn/r ...

  6. 图解说明——究竟什么是Windows句柄

    图解说明——究竟什么是Windows句柄 参考资料:http://blog.csdn.net/newjerryj/article/details/4383701 http://www.cnblogs. ...

  7. code of C/C++(3) - 从 《Accelerated C++》源码学习句柄类

    0  C++中多态的概念 多态是指通过基类的指针或者引用,利用虚函数机制,在运行时确定对象的类型,并且确定程序的编程策略,这是OOP思想的核心之一.多态使得一个对象具有多个对象的属性.class Co ...

  8. matlab初学之句柄

    文章出处:http://www.cnblogs.com/CBDoctor/archive/2012/04/06/2434072.html 在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每 ...

  9. c++句柄设计

    句柄,也称为智能指针. 我计算了一下我的时间,以后每14天得读完一本书,才不愧对我买的这么多书.然而我还要抽出时间来谢谢博文.最近读的是c++沉思录,开篇就用了3章来讲述句柄.好了,废话少说,接下来谈 ...

  10. Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转)

    用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是 回调函数.我的理解是这样的: 回 调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等 ...

随机推荐

  1. Win7 64位 php+Apache+mysql 配置

    注明:此文转载至 http://www.cnblogs.com/isyouth/p/3778045.html 一 :准备阶段 1:php php下载链接:http://windows.php.net/ ...

  2. Zend Framework 框架搭建

    通过手工方法搭建Zend Framework的MVC框架结构.首先看一下zend framework mvc的目录结构 1. 在根目录下面创建 public ,并在 public 下创建 index. ...

  3. php递归函数,性能给力

    function arPro($data,$res=array(),$pid='0',$level='0'){ foreach ($data as $k => $v){ if($v['comme ...

  4. 正式学习React (六) 项目篇

    https://github.com/huenchao/yingshili 或者点这里 注意事项看ReadME.md 会持续更新,反正就是把之前分析的redux react-redux都用一下,然后会 ...

  5. racle undo 解析

    racle undo 解析 声明一下:关于oracle的文章基于boobooke小布老师视频,在我学习的过程中,每有体会拿来分享,虽然从理解到整理分享很耗时,但我想这样的学习是扎实的. Undo是干嘛 ...

  6. eclipsecpp从可执行程序员中导入源代码并调试

    如果寻找跨平台IDE及调试环境,那eclipse是最佳选择了,因为它有一项超强功能:可以从可执行程序员导入源代码并调试程序,这种特性是非常适合自定义MakeFile项目,不需要改变项目现有结果,即可自 ...

  7. POSIX和SYSTEM的消息队列应该注意的问题

    首先看看POSIX的代码: 1.posix_mq_server.c #include <mqueue.h>#include <sys/stat.h>#include <s ...

  8. 全国计算机等级考试二级教程-C语言程序设计_第3章_顺序结构

    1输入两个整数给变量x和y:然后输出x和y:在交换x和y中的值后,在输出x和y. #include <stdio.h> main() { int x, y, t; printf(" ...

  9. Number Sequence(kmp)

        Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  10. jquery如何获得页面元素的坐标值

    http://www.cnblogs.com/pansly/archive/2011/05/25/2056222.html jquery如何获得页面元素的坐标值   yulutxt是输入经典语录的输入 ...