新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → 在C#应用程序与DLL交互中使用消息 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 8635 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: 在C#应用程序与DLL交互中使用消息 举报  打印  推荐  IE收藏夹 
       本主题类别: Description Logics    
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 在C#应用程序与DLL交互中使用消息

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


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/8/24 14:18:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/3/28 15:40:03

    本主题贴数3,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  在C#应用程序与DLL交互中使用消息(5064字) - 卷积内核,2009年8月24日
        回复:  多谢楼主!学习了!(18字) - mrlyff,2010年2月3日
        回复:  多谢楼主分享(12字) - long502481209,2009年11月21日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms