타 프로세스에 메세지를 전송하는 방법은 여러가지가 있겠지만,

 

2개의 Winform 프로그램에서 SendMessage 함수를 이용해 타 프로세스에 문자열 메세지를 전송하는 방법을 포스팅하겠습니다.

 

 

 

WM_COPYDATA 메세지를 이용하겠습니다. 예제를 위한 코드이니 코드 중복은 이해해주세요^^;

 

메세지를 수신할 Winform에서는 WndProc(윈도우 프로시져) 메서드를 오버라이드합니다.

 

 

 

 

 

 const int WM_COPYDATA = 0x4A;

 

        public struct COPYDATASTRUCT

        {

            public IntPtr dwData;

            public int cbData;

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;

        }

 

        protected override void WndProc(ref Message m)

        {

            try

            {

                switch (m.Msg)

                {

                    case WM_COPYDATA:

                        COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));

                        MessageBox.Show(cds.lpData);

                        break;

                    default:

                        base.WndProc(ref m);

                        break;

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

 

 

 

 

메세지를 전송할 Winform에서는 SendMessage 함수를 이용해 메세지를 송신합니다.

 

 

 

 

const int WM_COPYDATA = 0x4A;

  

        [DllImport("user32.dll", CharSet = CharSet.Auto)]

        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, ref COPYDATASTRUCT lParam);

 

        public struct COPYDATASTRUCT

        {

            public IntPtr dwData;

            public int cbData;

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;

        }

 

        private void OnButtonSendClick(object sender, EventArgs e)

        {

            string msg = this.tbMsg.Text.Trim();

 

            if (string.IsNullOrEmpty(msg))

            {

                MessageBox.Show("메세지를 입력해주세요");

                return;

            }

 

           Process []pro  =  Process.GetProcessesByName("HowToPostMessage");

           if(pro.Length > 0)

            {

                byte[] buff = System.Text.Encoding.Default.GetBytes(msg);

 

                COPYDATASTRUCT cds = new COPYDATASTRUCT();

                cds.dwData = IntPtr.Zero;

                cds.cbData = buff.Length+1;

                cds.lpData = msg;

 

                SendMessage(pro[0].MainWindowHandle, WM_COPYDATA, 0, ref cds);

            }

        }

 

 

 

 

프로젝트 압축 파일입니다.

 

 

HowToPostMessage.zip

 

+ Recent posts