自是人生长恨水长东

C++ C# PERL ERLANG C MS LINUX

C++博客 首页 新随笔 联系 聚合 管理
  13 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

需要在窗体间传递消息。
参考文章如下:
C#自定义消息通信往往采用事件驱动的方式实现,但有时候我们不得不采用操作系统的消息通信机制,例如在和底层语言开发的DLL交互时,是比较方便的。下面列举了一些实现方式,供大家参考:

一、通过SendMessage或postmessage函数发送:

1、  定义消息
在C++中引用底层的函数很简单,自定义消息如下
#define WM_TEST WM_USER + 101
而在c#中消息需要定义成windows系统中的原始的16进制数字,比如自定义消息
public const int USER = 0x0400;

 public const int WM_TEST = USER +101;

2、  发送消息
消息发送是通过windows提供的API函数SendMessage或postmessage来实现的,它的原型定义:       

[DllImport("User32.dll",EntryPoint="SendMessage")]
          private static extern int SendMessage(
            IntPtr hWnd,      // 窗体句柄
            uint Msg,         // 消息的标识符
            uint wParam,      // 具体取决于消息
            uint lParam       // 具体取决于消息
       );

[DllImport("User32.dll",EntryPoint="PostMessage")]
          private static extern int SendMessage(
            IntPtr hWnd,      // 接收消息的那个窗口的句柄。如设为HWND_BROADCAST,表示投递给系统中的所有顶级窗口。如设为零,表示投递一条线程消息(可参考PostThreadMessage)
            uint Msg,         // 消息的标识符
            uint wParam,      // 具体取决于消息
            uint lParam       // 具体取决于消息
       );

至于两个函数的区别这里就不累述了,有兴趣的朋友可以自己查阅资料。


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#中如何获取窗口句柄,参考网上文章如下:
1、如何获得一个窗口的句柄?
例如获取窗口PictureBox控件(其他控件也可以)的句柄,
IntPtr handle = pictureBox.Handle;
尝试之,发现错误。
非静态的方法或字段要求对象引用
然后修改。尝试如下:
Form1  frm = new Form1();
IntPtr handle = frm .Handle;
然后传递消息就可以了。

posted on 2010-10-15 10:26 傅红血 阅读(1323) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理