C#中在应用程序和DLL使用消息
在C#中使用自定义消息
在C#中使用自定义消息非常简单,只需要下面几个简单的步骤就可以了:
1、 定义消息
定义消息的方法和VC中定义消息有一点点不同
比如在VC中申明一个自定义消息:
#define WM_TEST WM_USER + 101
而在c#中消息需要定义成windows系统中的原始的16进制数字,比如自定义消息
public const int USER = 0x0400;
那么我们在VC中申明的自定义消息,在C#中就可以做对应的声明:
public const int WM_TEST = USER+101;
2、 发送消息
消息发送是通过windows提供的API函数SendMessage来实现的,它的原型定义: [DllImport("User32.dll",EntryPoint="SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // handle to destination window
uint Msg, // message
uint wParam, // first message parameter
uint lParam // second message parameter
);
3、 消息接收
消息发出之后,在Form中如何接收呢?我们可以重载DefWinproc函数来接收消息。
protected override void DefWndProc ( ref System.Windows.Forms.Message m )
{
switch(m.Msg)
{
case Message.WM_TEST: //处理消息
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}
在C#中使用系统消息
我们以WM_PAINT消息的处理为例,在C#中处理消息与MFC的消息处理是类似的,但更为简单。MFC中需要使用DECLARE_MESSAGE_MAP来定义消息映射,在C#就不需要了。比如WM_PAINT消息,我们只要重载父类中的OnPaint虚拟方法即可,方法如下:
在菜单View->Other Windows->Object Browser打开对象浏览窗口(或用CTRL+ALT+J打开),在我们的工程名下找到Form并选中,这时在右边的窗口列出所有Form类的成员函数,如图所示:
我们选中OnPaint(System.WinForms.PaintEventArgs)此时在下面会显示完整的OnPaint函数protected void OnPaint ( System.WinForms.PaintEventArgs e )我们将这一行字符串Copy下来。打开Form1.cs进行代码编辑,我们把刚才拷贝下来的函数定义复制到Form1类里面,并加上override关键字,此时我们便可以在里面添加我们的消息处理代码了,请参考如下代码段:
protected override void OnPaint (System.Windows.Forms.PaintEventArgs e )
{
Font font = new Font("黑体",28);///定义字体:黑体,大小:28
SolidBrush bluepen = new SolidBrush(Color.Blue);///创建蓝色画笔
SolidBrush blackpen = new SolidBrush(Color.FromARGB(0xa0,0xa0,0xb0));///创建黑色画笔
e.Graphics.DrawString("VC知识库",font,blackpen,65,25);///写字符串
e.Graphics.DrawString("VC知识库",font,bluepen,61,21);///偏移4个象素用不同的颜色再写一次,达到立体效果
}
示例应用
1、 定义消息
我们在工程中添加一个Message类用来定义消息。然后添加了三个成员变量,其中USER为自定义消息的初始值,相当与MFC中的WM_USER。WM_TEST为自定义的用来响应应用程序的消息,WM_MSG为自定义的用来响应DLL传递过来的消息。如何在DLL定义消息请参考文章:VC.Net从DLL传递消息到DLL。
public class Message
{
public const int USER = 0x0400;
//as mfc Define WM_TEST WM_USER + 101
public const int WM_TEST = USER+101;
public const int WM_MSG = USER+102;
}
2、 声明引用函数
在使用消息的地方,申明引用的函数,我们这里在MsgForm.cs文件中申明:
//申明发送消息函数
[DllImport("User32.dll",EntryPoint="SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // handle to destination window
uint Msg, // message
uint wParam, // first message parameter
uint lParam // second message parameter
);
//申明DLL中启动消息函数
[DllImport("MessageDLL.dll",EntryPoint="StartSendMessage")]
private extern static void StartSendMessage(IntPtr hWnd);
3、 处理系统消息
protected override void OnPaint ( System.Windows.Forms.PaintEventArgs e )
{
///定义字体:黑体,大小:28
Font font = new Font("黑体",28);
///创建蓝色画笔
SolidBrush bluepen = new SolidBrush(Color.Blue);
///创建黑色画笔
SolidBrush blackpen = new SolidBrush(Color.FromArgb(0xa0,0xa0,0xb0));
///写字符串
e.Graphics.DrawString("VC知识库",font,blackpen,65,25);
///偏移4个象素用不同的颜色再写一次,达到立体效果
e.Graphics.DrawString("VC知识库",font,bluepen,61,21);
}
4、 触发自定义消息
//测试应用程序消息
private void TestAppbutton_Click(object sender, System.EventArgs e)
{
SendMessage(this.Handle,Message.WM_TEST,100,200);
}
//测试DLL消息
private void TestDLLbutton_Click(object sender, System.EventArgs e)
{
StartSendMessage(this.Handle);
}
5、 响应和处理自定义消息
protected override void DefWndProc ( ref System.Windows.Forms.Message m )
{
string message;
switch(m.Msg)
{
case Message.WM_TEST://处理消息
message = string.Format("收到从应用程序发出的消息!参数为:{0},{1}",m.WParam,m.LParam);
MessageBox.Show(message);///显示一个消息框
break;
case Message.WM_MSG:
message = string.Format("收到从DLL发出的消息!参数
为:{0},{1}",m.WParam,m.LParam);
MessageBox.Show(message);///显示一个消息框
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}
程序运行结果:
当我们点击测试DLL消息时,弹出消息框显示收到消息的参数,窗口也会调用WM_PAIN函数对窗口进行重新绘制。
相关文章:

倪光南院士:openEuler与全球开发者共同推动计算产业发展
今日,以“创造最好的OS,成就更好的我们”为主题的 openEuler Developer Day 2021在北京成功举行。本次大会由openEuler社区发起,产业组织专家、学者、企业领袖和开发者们围绕多样性计算、云原生全栈、全场景协同等技术方向共同探讨和创新。大…

jhello框架-ajax
2019独角兽企业重金招聘Python工程师标准>>> 现在的web开发没有ajax都没法活,所以在jhello中实现了一个简单的ajax交互,使用json作为载体。 在上篇《交互》中讲到一种交互的方式是把数据放入Model中,通过ModelAndView类返回到视图…

发微信模版消息换行用\n
发微信模版消息换行用\n发微信模版消息换行用\n发微信模版消息换行用\n发微信模版消息换行用\n发微信模版消息换行用\n转载于:https://blog.51cto.com/xuqin/1974131

二次元会让人脸识别失效吗?
来源 | PyTorch 开发者社区责编 | 寇雪芹头图 | 下载于ICphoto人脸识别也遇到坑了,识别得了三次元,却对二次元无效。迪士尼的技术团队,正在开发这一算法,以帮助动画制作者进行后期搜索。团队利用 PyTorch,效率得到很大…

基于第四层交换技术的负载均衡
摘 要 本文介绍了第四层交换技术的概念,技术原理以及如何使用第四层交换技术实现远程教育系统中的应用服务器负载均衡。 作者: 凌仲权,现就读于西安电子科技大学,2001级硕士研究生。主要的科研方向为计算机网络技术研究以及远程教…

開始Unity3D的学习之旅
前言:这个系列的文章纯属对自己学习的整理,非高手之作。但确实的记载了我作为一个没接触过3D游戏编程的大学生的心路历程。争取每周整理一次吧。之所以会開始学Unity3D,最基本的原因是由于在快放暑假的时候,我找了一家做iPhone游戏…

linux 定时任务crond
1.定时任务crond 1.1 crond是什么 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。特殊需求:(秒级别)crond服务就无法搞定了,一般工作中写脚本守护进程执行。 为什么要使用crond定时任务: linux系…

用C#去除代码的SourceSafe管理
经常看一些的程序,有些一个解决方案带有多个项目,由于代码比较多,多人开发,所以好多vs.net下的工程是用source safe进行版本控制的。而用source safe进行版本控制需要局域网路径共享,因此好多项目换一台机器打开会出现…

用jarsigner对android apk进行签名
以前对apk重新打包签名都是用的apktool里面的Auto-sign 工具,后来发现有时候利用该工具对一些apk签名会失败,所以后来就使用 jarsigner这个工具,现记录一下这个工具的使用方法1 首先要生成一个自己的keyD:\>keytool -genkey -alias myKey…

利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上的疏散耦合,而非…

C#操作消息队列
public class QueueManage { /// /// 发送对象到队列中 /// /// 队列名称,因为队列名称在一个应用中应该不改变的,所以大家最好写在配置文件中 /// 要发出去的对象 public static void SendQueue(string QueuePath,MyBase.SmsQueue sq) { Syste…

2021《程序员》数字科技企业研发实力榜TOP50
互联网的盛行带来了众多数字科技企业的崛起,但如何客观地衡量每家企业的技术实力?研发投入、研发人才的数量和人才密度是关键指标。2021年5月,《程序员》根据相关企业披露的财报数据及市场调研数据,整理发布“2021数字科技企业研发实力榜TOP5…

eclipse中java项目转换为web项目
2019独角兽企业重金招聘Python工程师标准>>> 经常在eclipse中导入web项目时,出现转不了项目类型的问题,导入后就是一个java项目,有过很多次经历,今天也有同事遇到类似问题,就把这个解决方法记下来吧&#x…

MySQL · 引擎介绍 · Sphinx源码剖析(三)
在本节中我会介绍Sphinx在构建索引之前做的一些事情,主要是从mysql拉取数据保存,然后分词排序保存到内存等等一系列的操作。下面是几个相关指令 sql_query \SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, \title, content \FROM doc…

C#给图片添加版权信息
现在越来越多的网站都喜欢将用户上传的图片加上网站的版权信息,不要以为那是用photoshop之类的图片处理软件加上去的,其实我们只要写一小段代码,就可以实现这个功能。 添加版权信息的原理其实挺简单:通过图片获取Graphics类的对象…

Python + 爬虫:可视化大屏帮你选粽子
来源 | 数据分析与统计学之美头图 | 下载于ICphoto端午节快要到了,旅游?回家?拜访亲友?少不了要带上粽子。那么,选择什么牌子的粽子呢?选择什么口味的粽子呢?选择什么价格区间呢?今年…

adviser vs mentor
研究生或博士生提到自己导师的时候是说adviser呢?还是mentor呢? 至少我认识一个Berkeley的博士是说adviser的。 另外,我的导师也是说adviser。 那还是说adviser吧……

T extends Serializable这是什么意思呢?看明白这个,你的问题就自然而然的明白了!...
1.转自:https://blog.csdn.net/liwenqiang758/article/details/8131185 自己动手丰衣足食!!! 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 这种参数类型可以用在类、接口和方法的创建中&a…

C#中switch语句注意
大家肯定对switch语句并不陌生,它能够让程序根据控制表达式的值,从多个动作中作出选择(从逻辑过程看,和多分支语句if-else有些相似)。在C和java中也有这一语句,不过在C#中,这一语句则有了些变化。先看下边一…

对Cost (%CPU) 粗略的理解
今天研究执行计划,看到执行计划里面有Cost (%CPU),我这边研究了一把,不知道对与否,拿出来晒晒在Oracle 10g中,Oracle 把CPU的cost也统计在执行计划中去了, 这和以前的8i,9i(9i其实已经开始了)有很大的不同。…

后疫情时代,RTC期待新的场景大爆发
整理 | 寇雪芹头图 | 下载于ICphoto出品 | AI 科技大本营(ID:rgznai100) 过去的一年中,新冠疫情悄然改变了社会发展和人们的生活,也助推了实时音视频(Real-Time Communication)技术的落地应用,数…

JS-DOM-元素节点
查看元素节点: 1、getElementById():通过 id 取到唯一节点;如果 id 重名,只能取到第一个 getElementByName(): 通过name属性 getElementByTagName(): 通过标签名 getElementByClassName(): 通过class名 获取元素节点时,一定要注意:获取节点的语句,必须在 DOM 渲染完成之后执行。…

现代软件工程 第十章 【典型用户和场景】 练习与讨论
1. 讨论:下面的老板犯了什么错误? 只看用户的表面语言或行动还是不够的。我们还要找到用户语言行动背后的动机! (图像来源: http://www.weibo.com/funnyshoelace) 2. 是否要文档 有人说,我们敏捷的团队,就喜欢直接的面对面的交流࿰…

赠书 | 读懂生成对抗神经网络 GAN,看这文就够了
生成对抗神经网络(Generative Adversarial Nets,GAN)是一种深度学习的框架,它是通过一个相互对抗的过程来完成模型训练的。典型的GAN包含两个部分,一个是生成模型(Generative Model,简称G&#…

把Doc文档转换成rtf格式
先在项目引用里添加上对Microsoft Word 9.0 object library的引用。 using System; namespace DocConvert { class DoctoRtf { static void Main() { //创建一个word的实例 Word.Application newApp new Word.Application(); // 指定源文件和目标文件 object Source&quo…

中国书法的造型元素与原理 刘彦湖
为什么80%的码农都做不了架构师?>>> --------------------------------------------------------------------------------中国书法的造型元素与原理 刘彦湖 中国书法是用最基本的元素遵从中国人特有的形式原则建构起来的大厦。 对于元素及其品质的认…

融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合
从无序中寻找踪迹,从眼前事探索未来。2021 年正值黄金十年新开端,CSDN 以中立技术社区专业、客观的角度,深度探讨中国前沿 IT 技术演进,推出年度重磅企划栏目——「拟合」,通过对话企业技术高管大咖,跟踪报…

推荐一个个人感觉比较有吸引力的网站
2019独角兽企业重金招聘Python工程师标准>>> 廖雪峰的官方网站 转载于:https://my.oschina.net/AaronCN/blog/294293

C# 2进制、8进制、10进制、16进制...各种进制间的轻松转换
在.NET Framework中,System.Convert类中提供了较为全面的各种类型、数值之间的转换功能。其中的两个方法可以轻松的实现各种进制的数值间的转换: Convert.ToInt32(string value, int fromBase): 可以把不同进制数值的字符串转换为数字&#x…