C#实现在Form上截取消息的两种方法
比较常用的是重载Form的DefWndProc方法,例如截取鼠标按下的消息:
protected override void DefWndProc(ref Message m)
{
if ( m.Msg == 0x0201 )
{
MessageBox.Show(m.Msg.ToString());
}
else
{
base.DefWndProc (ref m);
}
}
还可以通过另一种办法,使用IMessageFilter 接口:
public class
MessageFilter : IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == 0x0201)
{
MessageBox.Show("WM_LBUTTONDOWN is: " +
m.Msg);
return true;
}
return false;
}
}
然后使用Application.AddMessageFilter方法,例如:
private static
MessageFilter msgFliter = new MessageFilter();
在Main方法中注册消息筛选器:
Application.AddMessageFilter(msgFliter);
如果要取消注册,可以调用Application.RemoveMessageFilter方法
在这里有一个Windows的MessageID的枚举,挺有用的,好几次都忘了地址,这次写在这里好好保存
Windows Message ID
constants
一、截取系统消息
方法一:
//添加监视消息
private void Form_Load(object sender, System.EventArgs e)
{
Application.AddMessageFilter(this);
}
//撤消消息监视
private void Form_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
Application.RemoveMessageFilter(this);
}
//截取消息,进行处理
public bool PreFilterMessage(ref System.Windows.Forms.Message
m)
{
switch(m.Msg )
{
case 513: //拦截左键单击事件
MessageBox.Show("哈哈,你点击了左键被拦截!");
return true; //返回true则消息被裁取,系统不再处理
case 516: //拦截左键单击事件
MessageBox.Show("哈哈,你点击了右键被拦截!");
return true; //返回true则消息被裁取,系统不再处理
default:
return false; //返回false则消息未被裁取,系统会处理
}
}
方法二:
//截取消息,进行处理
protected override void WndProc(ref Message
m)
{
switch(m.Msg)
{
case 17:
MessageBox.Show("哈哈,你不能关闭计算机!");
m.Result=(IntPtr)0;
break;
case 513:
MessageBox.Show("哈哈,你不能点击左键!");
m.Result=(IntPtr)0;
break;
case 516:
MessageBox.Show("哈哈,你不能点击右键!");
m.Result=(IntPtr)0;
break;
default:
base.WndProc(ref m);
break;
}
}
C#实现在Form上截取消息的两种方法的更多相关文章
- RabbitMQ实现延时消息的两种方法
目录 RabbitMQ实现延时消息的两种方法 1.死信队列 1.1消息什么时候变为死信(dead-letter) 1.2死信队列的原理 1.3 代码实现 1.4死信队列的一个小坑 2 .延时插件 2. ...
- GitHub常用上传文件的两种方法 附带常见的问题及Git安装教程
从早上下课到现在一直在琢磨如何给Github下载本地文件,中午饭都没吃.还好是解决了,感觉挺有成就感的.O(∩_∩)O哈哈~ 好哒 闲话不说,说重点. 一.git的安装 百度云:http://pan. ...
- iManager微服务自定义上传数据的两种方法
背景 当数据量大时,通过浏览器上传可能速度较慢,可以使用以下两种方式进行数据导入. 方法一 1.访问k8s主页(31234端口) 找到所创建的微服务的命名空间(例如icloud-native-xxx) ...
- linux服务器上安装jdk8的两种方法
这里介绍两种安装方式: yum安装(力荐) 从官网下载包安装 获得一台linux服务器 要在linux下安装jdk,首先你得先有一台linux服务器,虚拟机或者租一台都可以 yum安装jdk 在l ...
- SecureCRT 上传文件的两种方法 Zmodem、SFTP
Zmodem: 无论有xshell还是secureCRT连接linux的时. 默认都用一个zmodem可以帮助window和linux之间传输文件 很方便和实用的工具. 不过默认是无法使用的 需要安装 ...
- form表单上传附件的几种方法
问题描述:在网页开发过程中,当需要上传附件(图片,音频,视频等)时,常规方法是使用form表单进行提交,这里总结一下form表单提交的几种方法. 参考地址:http://www.cnblogs.com ...
- net上传文件的三种方法
ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关 ...
- Android 截取手机屏幕两种实现方案解析
近期在开发的过程中,遇到了一个须要截取屏幕保存为图片的需求,详细为截取webview的视图保存图片. 方法1:首先想到的思路是利用SDK提供的View.getDrawingCache()方法: pub ...
- C#代码像QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法
你QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法: 要么重写需要弹出的窗体的事件: protected override CreateParams ...
随机推荐
- Web实现数据库链接的登录注册修改密码功能
/** * Copyright (C), 2017-2017 * FileName: User * Author: ichimoku * Date: 2017/12/5 14:31 * version ...
- 《c程序设计语言》读书笔记-5.8-天数和日期转换错误检查
#include "stdio.h" #include "stdlib.h" #include "string.h" static char ...
- vue的过渡效果
https://segmentfault.com/a/1190000007738518
- Nodejs 基础知识 浅析
1. 模块化 ①常用模块化规范 CommonJS + nodejs AMD(Asynchronous Module Definition) + RequireJS CMD(Common Module ...
- bzoj 2159 - Crash 的 文明世界
Description 给定一棵\(n\le 10^5\)的树, 和\(k\le 150\) 求每个点\(x\)的\[S(x) = \sum_{y=1}^n dis(x, y) ^ k\] Analy ...
- .net yield return
yield在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一: yield return <expression>; yield break; 计算表达式并以枚举数对 ...
- Linux网络编程一步一步学【转】
转自:http://blog.chinaunix.net/uid-10747583-id-297982.html Linux网络编程一步一步学+基础 原文地址:http://blogold.chin ...
- Python基础-迭代器&生成器&装饰器
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 我现在有个需求,看 ...
- 配置OpenResty支持SSL(不受信任的证书)
#关闭防火墙 chkconfig iptables off service iptables stop #关闭SELINUX sed -i 's/SELINUX=enforcing/SELINUX=d ...
- 关于yii2 的db log 日志 错误处理errorHandler
log 通过配置Web.config来完成 1 数据库增加 ‘前缀_log’表 2 配置Web.config 'bootstrap' => ['log'], 'components' => ...