protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE)
{
// 屏蔽传入的消息事件
this.WindowState = FormWindowState.Minimized;
return;
}
base.WndProc(ref m);
} protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
const int SC_MINIMIZE = 0xF020;
if (m.Msg == WM_SYSCOMMAND && ((int)m.WParam == SC_MINIMIZE || (int)m.WParam == SC_CLOSE))
{
//最小化到系统栏
this.Hide();
return;
}
base.WndProc(ref m);
} ----------------------------------------------
不规则窗体拖动 using System.Runtime.InteropServices; [DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002; public void ShapedForm_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, );
} -------------------------------------------------------------------
protected override void WndProc(ref Message m)
{
//拦截窗体最小化按钮消息,调用隐藏动画并隐藏窗体
if (m.Msg == (int)hyFrameWork.win32Api.Enum.WinMsg.WM_SYSCOMMAND)
{
if (m.WParam.ToInt32() == (int)hyFrameWork.win32Api.Enum.ECNCSysCommandConstants.SC_MINIMIZE)
{
formShowControl(false);
return;
}
}
base.WndProc(ref m);
}
-------------------------------------------

/////////////////////////////////////////////////////////////////////

通知消息(Notification message)是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通

知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows 95公

共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的

滚动条都会产生通知消息。

按扭

B N _ C L I C K E D //用户单击了按钮

B N _ D I S A B L E //按钮被禁止

B N _ D O U B L E C L I C K E D //用户双击了按钮

B N _ H I L I T E //用户加亮了按钮

B N _ PA I N T按钮应当重画

B N _ U N H I L I T E加亮应当去掉

组合框

C B N _ C L O S E U P组合框的列表框被关闭

C B N _ D B L C L K用户双击了一个字符串

C B N _ D R O P D O W N组合框的列表框被拉出

C B N _ E D I T C H A N G E用户修改了编辑框中的文本

C B N _ E D I T U P D AT E编辑框内的文本即将更新

C B N _ E R R S PA C E组合框内存不足

C B N _ K I L L F O C U S组合框失去输入焦点

C B N _ S E L C H A N G E在组合框中选择了一项

C B N _ S E L E N D C A N C E L用户的选择应当被取消

C B N _ S E L E N D O K用户的选择是合法的

C B N _ S E T F O C U S组合框获得输入焦点

编辑框

E N _ C H A N G E编辑框中的文本己更新

E N _ E R R S PA C E编辑框内存不足

E N _ H S C R O L L用户点击了水平滚动条

E N _ K I L L F O C U S编辑框正在失去输入焦点

E N _ M A X T E X T插入的内容被截断

E N _ S E T F O C U S编辑框获得输入焦点

E N _ U P D AT E编辑框中的文本将要更新

E N _ V S C R O L L用户点击了垂直滚动条消息含义

列表框

L B N _ D B L C L K用户双击了一项

L B N _ E R R S PA C E列表框内存不够

L B N _ K I L L F O C U S列表框正在失去输入焦点

L B N _ S E L C A N C E L选择被取消

L B N _ S E L C H A N G E选择了另一项

L B N _ S E T F O C U S列表框获得输入焦点

        static bool flag = false;
protected override void WndProc(ref Message m)//C# 重写 WndProc 移动窗口
{
switch (m.Msg) {
case 0x0200: //WM_MOUSEMOVE
if (flag)
{
PostMessage(this.Handle, 0x00A1,new IntPtr(),m.LParam);//这里需要导入 user32.dll
}
break;
case 0x201://WM_LBUTTONDOWN
flag = true;
break;
case 0x202://WM_LBUTTONUP
flag = false;
break;
default:
base.WndProc(ref m);
break;
} [DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
------------------------------------------------------------
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wparam, int lparam);
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e); if (e.Button == MouseButtons.Left)//按下的是鼠标左键
{
Capture = false;//释放鼠标,使能够手动操作
SendMessage(Handle, 0x00A1, , );//拖动窗体
}
}
--------------------------------------------------------
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0201://鼠标左键按下的消息
m.Msg = 0x00A1;//更改消息为非客户区按下鼠标
m.LParam = IntPtr.Zero;//默认值
m.WParam = new IntPtr();//鼠标放在标题栏内
break;
}
base.WndProc(ref m);
}
---------------------------------------------------- 重写 WndProc函数来同时实现无标题栏的窗体移动和禁止双击窗体最大化 protected override void WndProc(ref Message m)
{
const int WM_NCHITTEST = 0x84;
const int HTCLIENT = 0x01;
const int HTCAPTION = 0x02;
const int WM_SYSCOMMAND = 0x112;
const int SC_MAXMIZE = 0xF030;
const int WM_NCLBUTTONDBLCLK = 0xA3;
switch (m.Msg)
{
case 0x4e:
case 0xd:
case 0xe:
case 0x14:
base.WndProc(ref m);
break;
case WM_NCHITTEST://鼠标点任意位置后可以拖动窗体 this.DefWndProc(ref m);
if (m.Result.ToInt32() == HTCLIENT)
{
m.Result = new IntPtr(HTCAPTION);
return;
}
break;
case WM_NCLBUTTONDBLCLK://禁止双击最大化
Console.WriteLine(this.WindowState); return;
break;
default: base.WndProc(ref m);
break;
}
}
----------------------------------------------------------
   第一步,先在类的级别中申明两个API函数,

  ///注册热键
  [DllImport("user32.dll")]
  private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);
  ///卸载热键
  [DllImport("user32.dll")]
  private static extern bool UnregisterHotKey(IntPtr hWnd, int id);   注意引入名字空间 System.Runtime.InteropServices;   上面两个函数参数的解释:   RegisterHotKey 函数中,   hWnd为本程序窗口的句柄,在C#的窗口中直接用Handle属性就可以引用窗口句柄   id为热键的标示符,是我们自己定义的,因为一个程序中可以定义多个热键,所以要用这个字段来区别,具体用法见下   fsModifiers为激活热键时,是否和系统键组合使用,none: Alt: Ctrl: Shift:,并且还可以用或运算来组合使用   vk就是要定义的热键,C#中按键都被包含在Keys枚举中   UnregisterHotKey 函数中,   hWnd和RegisterHotKey 函数中是一样的,id为要卸载的热键标示   第二步,在窗口的初始化中注册热键,例如 RegisterHotKey(Handle, , , Keys.F9);   将些热键识别为100,0表示不使用系统键,Keys.F9表示此热键为F9,若要同时按Shift+Ctrl+F9,则第三个参数应该为 | 其实对二进制运算熟悉的朋友,               可以立刻算出 |=   第三步,可以响应热键了:   重写窗体的WndProc函数,具体代码为   protected override void WndProc(ref Message m) {
  //这个if的条件中固定的
  if (m.Msg == 0x312) {
  //这个if就在于判断是哪个热键,100对应上面RegisterHotKey函数中的第二个参数
  if (m.WParam.ToInt32() == ) {
  //这里就是响应的函数
  DoSomething();
  }
  }
  base.WndProc(ref m);
  }   WndProc()函数的功能就是处理Windows消息,在其它地方还将看到这个函数的妙用!   第四步,在程序结束的时候调用UnregisterHotKey(Handle,)卸载此热键!   WIN32   第一步,在int WINAPI WinMain()函数中,   while(GetMessage(&msg,NULL,,)){……}   之前,注册热键   RegisterHotKey(hWnd,,,VK_F9)   VK_F9为WinUser.h中定义的宏,其他键也是用类似的形式进行定义,不过数字键和字母键,直接用'','A'这样的形式   第二步,在while(GetMessage(&msg,NULL,,)) {……}   循环体内,添加代码   //这是响应热键条件,从WM_HOTKEY宏的定义中,可以看出来它代表的值为 0x312 ,和C#中的if条件是一致的
  if(msg.message ==WM_HOTKEY)
  {
  //这里的条件用来判断热键的标示符
  if(msg.wParam==)
  {
  //这里调用想要执行的函数
  DoSomething();
  }
  }   第三步,在while()循环结束后,调用 UnregisterHotKey(hWnd,) 卸载热键。   MFC   第一步,在MFC的窗体中添加其WM_HOTKEY消息的响应,   void C热键Dlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
  {
  //这里用来判断热键的标识符
  if(nHotKeyId == )
  {
  //响应函数
  DoSomething();
  }
  CDialog::OnHotKey(nHotKeyId, nKey1, nKey2);
  }   第二步,在MFC窗体的初始化地方,添加注册热键的代码:   RegisterHotKey(m_hWnd,,,VK_F9);   注意上面的字段m_hWnd,是CWnd类中字段,完成由MFC控制,我们只需要在适合地方引用就可以了。   第三步,在窗体销毁的地方调用 UnregisterHotKey(hWnd,) 卸载热键就可以了。   到这里,大家可以已经掌握了在三种环境中设置系统级热键的方法。笔者的体会是,在WIN32和C#中方法大概相同,笔者就是在C#的基础上,尝试着在WIN32中实现该功能,结果一次成功,但是在MFC中就走了一些弯路。
------------------------------------------------------------------------ protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0005://change size: WM_SIZE
{
FormWindowState newState = FormWindowState.Normal;
switch (m.WParam.ToInt32())
{
case ://SIZE_RESTORED
newState = FormWindowState.Normal;
break;
case ://SIZE_MINIMIZED
newState = FormWindowState.Minimized;
break;
case ://SIZE_MAXIMIZED
newState = FormWindowState.Maximized;
break;
default:
break;
} if (newState != this.preWindowState)
{
this.OnWindowStateChanged(new WindowStateChangedEventArgs(this.preWindowState, newState));
this.preWindowState = newState;
}
}
break;
default:
break;
}
base.WndProc(ref m);
}
#endregion
}
}

WndPric的使用方法的更多相关文章

  1. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

  2. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  3. 【.net 深呼吸】细说CodeDom(6):方法参数

    本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...

  4. IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法

    直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...

  5. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

  7. ArcGIS 10.0紧凑型切片读写方法

    首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...

  8. [BOT] 一种android中实现“圆角矩形”的方法

    内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...

  9. JS 判断数据类型的三种方法

    说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...

随机推荐

  1. WPF DataGrid 之数据绑定

    1. Auto generation of columns 最简单的方法莫过于让DataGrid根据数据源中的字段自动生成列了: 根据实体类的公共属性, 能够自动生成四种类型的数据列,对应关系如下: ...

  2. 3.Android Studio系列教程3——快捷键

    原文链接:http://stormzhang.com/devtools/2014/12/09/android-studio-tutorial3/   一.更新Android Studio 项目根目录的 ...

  3. java下io文件切割合并功能加配置文件

    package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  4. javascript 获取图片原始尺寸

    javascript 获取图片原始尺寸 function getImgInfo(url){ var img = new Image(), loaded = false; var info = {}; ...

  5. PL/SQL Developer主界面窗口左边窗口默认设置

    中文版:在菜单 工具 -> 首选项 -> 用户界面 -> 选项 窗口中,将“自动保存桌面”勾选上就可以了. 截图如下: 英文版:在菜单 Tools -> Preferences ...

  6. 解决jQuery中美元符号($)命名与别的js脚本库引用冲突方法

    在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg') 的写法.然而,当我们引入多个js库后,在另外一个js库 ...

  7. jquery的queue方法

    queue: queue主要用于给元素上的函数队列(默认名为fx)添加函数(动画效果),这样dequeue就可以取出并执行函数队列中的第一个函数(即最先进入函数队列的函数),delay则可以延迟元素上 ...

  8. PHP学习系列(1)——字符串处理函数(1)

    从09年开始使用JAVA到现在差不多5年多了,然后由于即将要去的公司(研究僧终于要毕业了!)是使用PHP,Python作为后台开发语言的,所以要开始一段双P的学习旅程.用过PHP的都说这是很简单的一门 ...

  9. Python新手学习基础之数据类型——字符串的切片截取

    切片截取是python中字符串常见的一些操作,我们会在这篇文章里详细介绍,切片截取的作用是获取子字符或子字符串. 实际上,我们要做的就是使用索引,用冒号分隔两个索引,形式为:变量[头下标:尾下标],冒 ...

  10. MSIL

    公共字段Add 将两个值相加并将结果推送到计算堆栈上. Add_Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add_Ovf_Un 将两个无符号整数值相加,执行溢出检查,并且将结 ...