您的位置:首页精文荟萃软件资讯 → 在C#应用程序与DLL交互中使用消息

在C#应用程序与DLL交互中使用消息

时间:2004/10/8 13:18:00来源:本站整理作者:蓝点我要评论(0)

  在C#是一种类似 Java 的完全面向对象的高级编程语言,其处理过程采用事件驱动方式,但在实际的使用过程中,有时候通过调用系统原有的消息处理起来会更简单,特别是在处理与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);///写字符串


 ///偏移4个象素用不同的颜色再写一次,达到立体效果
 e.Graphics.DrawString("VC知识库",font,bluepen,61,21);
}



  示例应用


  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;
 }
}


相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本