[C#] 다른 Process 간 통신하기 (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("수신프로그램"); 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); } }
[수신 프로그램]
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); } }