Winform消息机制

 最近工作中刚好遇到一个这样的问题,两个软件,都需要用到一个硬件设备,当软件A在用时,B软件不能使用,当B软件在用时A软件也不能使用。这就意味着当软件A使用时,B软件就要关闭使用硬件的进程,B软件使用时也一样!

    在Winform中使用消息机制完成这个功能相当容易。请看以下代码!

 [DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern int FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);

上面两个是API中的方法,FindWindow是查找另一个程序的方法,SendMessage是向另一个程序发送消息,告诉他我要使用,让他关闭当前使用的硬件。

public const int WM_COPYDATA = 0x004A;

public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

上面的结构是sendmessage方法的一个参数类型,可用来传送参数,发送数据的!

  // 发送方代码,告知另一个程序
        public static void SendMessage()
        {
            int WINDOW_HANDLER = FindWindow(null, @"MyFormName");
            if (WINDOW_HANDLER != 0)
            {
                byte[] arr = System.Text.Encoding.Default.GetBytes("测试数据");
                
                COPYDATASTRUCT cds;
                cds.dwData = (IntPtr)1;
                cds.lpData = "测试数据";
                cds.cbData =arr.Length+ 1;
                SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
            }
        }

   //接收方代码
        protected override void DefWndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_COPYDATA:
                    COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                    Type mytype = mystr.GetType();
                    mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
                    label1.Text = mystr.lpData;

      //做自己的业务处理...
                    break;
                default:
                    base.DefWndProc(ref m);
                    break;

            }
        }

 

没有太多的解释,应该都挺好懂的,自己做个Demo看看就明白了!写在这里只是想做下笔记:)

posted on 2009-12-27 22:56  Ss_Andy  阅读(779)  评论(0编辑  收藏  举报