C#拦截系统消息
首先我们看下有哪几种拦截系统消息的方法:
//一、截取系统消息
//方法一:
//添加监视消息
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;
}
}
而上次写的软件用的就是第二种方法。因为习惯了,这次还是用这种方法吧。
现在我们改写这个方法,我们必须知道U盘插入拔出的系统消息。
DEVICECHANGE 0X219
DEVICEARRVIE 0X8000
DEVICEREMOVE 0X8004
我们拦截了DEVICECHANGE然后用tostring()方法:
msg=0x219 (WM_DEVICECHANGE) hwnd=0x50e54 wparam=0x8000
lparam=0x475e89c
result=0x0
也就是说,当有驱动器加载时是发送WM_DEVICECHANGE消息,但是判断驱动器是加载还是卸载就要判断WPARAM字段是DEVICEARRIVE还是DEVICEMOVE,所以我们编写如下测试代码。
程序说明:
protected override void WndProc(ref Message m)//监视Windows消息{
const int WM_DEVICECHANGE = 0x219;
const int WM_DEVICEARRVIAL = 0x8000;//如果m.Msg的值为0x8000那么表示有U盘插入
const int WM_DEVICEMOVECOMPLETE=0x8004;
switch (m.Msg)
{
case WM_DEVICECHANGE:
{
ShowDeviceChanged("WM_DEVICECHANGE");//
if (m.WParam.ToInt32() == WM_DEVICEARRVIAL)
ShowDeviceChanged("WM_DEVICEARRVIAL");
else if (m.WParam.ToInt32() == WM_DEVICEMOVECOMPLETE)
ShowDeviceChanged("WM_DEVICEMOVECOMPLETE");
}
break;
}
base.WndProc(ref m); //将系统消息传递自父类的WndProc
}

public void ShowDeviceChanged(string message){
switch(message)
{
case "WM_DEVICECHANGE":
this.textBox_Message.Text += "Device Changed \r\n";
break;
case "WM_DEVICEMOVECOMPLETE":
this.textBox_Message.Text += "Device Moved\r\n";
break;
case "WM_DEVICEARRVIAL":
this.textBox_Message.Text += "Device Arrived\r\n";
break;
}
}
C#拦截系统消息的更多相关文章
- C#拦截系统消息的方法-Application.AddMessageFilter
C#拦截系统消息的方法Application.AddMessageFilter Application.AddMessageFilter这个方法可以接收系统发出的消息: 首先定义一个类,继承IMess ...
- WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)
无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...
- c# 如何处理自定义消息
C#自定义消息通信往往采用事件驱动的方式实现,但有时候我们不得不采用操作系统的消息通信机制,例如在和底层语言开发的DLL交互时,是比较方便的.下面列举了一些实现方式,供大家参考:一.通过SendMes ...
- Winform改变Textbox边框颜色(转)
namespace MyTextBoxOne { //使用时必须把文本框的BorderStyle为FixedSingle才能使用 //一些控件(如TextBox.Button等)是由系统进程绘制,重载 ...
- 实现类QQ的编辑框
第一步,平面效果.Windows系统有几个消息专门用来处理Windows组件的边框部位,那就是WM_NCCALCSIZE和WM_NCPAINT这两个消息,从消息名字看来NC这个就代表着No Clien ...
- C#在WinForm中重写ProgressBar控件(带%的显示)
废话少说,直接上码: namespace csPublish { [ToolboxItem(true)] class textProgressBar : System.Windows.Forms.Pr ...
- C# Winfrom 自定义控件——带图片的TextBox
效果: 描述: 本来是想用GDI在左边画图片上去的,文本是居中对齐,如果文本是左对齐,文本会把图片遮住控件长这样: 但这样做,输入框在获取焦点时候,会把图片挡住就像这样: 输入完成之后图片就会显示完整 ...
- Winform改变Textbox边框颜色
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 【转】C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1)
C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息 /// 截获消息 处理XP不能关机问题 protected ...
随机推荐
- Python: 二进制、八进制、十六进制转换或者输出
为了将整数转换为二进制.八进制或十六进制的文本串,可以分别使用bin() ,oct() 或hex() 函数: >>> x = 1234 >>> bin(x) '0b ...
- mongo数据库连接工具类(C#)
Framework版本:.Net Framework 4 using System; using System.Collections.Generic; using System.Linq; usin ...
- Spring整合Quartz定时发送邮件
功能描述:刚开始接触Quartz,试着用Quartz整合spring实现每隔一分钟发送一封邮件连续发送10次 核心jar: 邮件发送:commons-email-1.2.jar mail.jar(必须 ...
- Vue学习笔记之Vue介绍
vue的作者叫尤雨溪,中国人.自认为很牛逼的人物,也是我的崇拜之神. 关于他本人的认知,希望大家读一下这篇关于他的文章,或许你会对语言,技术,产生浓厚的兴趣.https://mp.weixin.qq. ...
- vs显示行号
1.工具 2.选项 3.文本编辑器 4.C\C++ 5.常规->显示行号
- HDU 2457 DNA repair(AC自动机+DP)题解
题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...
- 使用 v-cloak 防止页面加载时出现 vue.js 的变量名
知识点:使用 v-cloak 防止页面加载时出现 vue.js 的变量名 场景:在使用vue语法,实现下拉框功能时,展示数据列表之前,出现对应的 vuejs 变量名 代码: var vm = new ...
- python 生成zip压缩包
import zipfile file_name="a.txt" f = zipfile.ZipFile('test.zip','w',zipfile.ZIP_STORED) f. ...
- Java Spring-Spring框架概述
2017-11-06 15:55:38 Spring 是分层的JavaSE/EE full-stack(一站式)轻量级开源框架. * 分层:SUN公司提供了EE的三层结构:Web层,业务层,数据访问层 ...
- JVM虚拟机调优指南
本章通过阅读JVM垃圾搜集指南文档,整理虚拟机主要配置以及,理解不同的垃圾搜集器. 垃圾搜集算法 引用计数算法 根搜索算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 搜集算法网上有很多介 ...