타 프로세스에 메세지를 전송하는 방법은 여러가지가 있겠지만,
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); } }
|
프로젝트 압축 파일입니다.
'.Net > Winform' 카테고리의 다른 글
[펌]윈도우 7 테스크바를 활용한 애플리케이션 개발 (0) | 2013.08.22 |
---|---|
C# IP 및 HostName으로 MacAddress 얻기 (0) | 2013.07.19 |
C# Winform에서 DaumAPI 사용하기[3]_Focus 버그 수정 (0) | 2013.02.27 |
C# 응용 프로그램 관리자 권한으로 실행하기 (1) | 2013.02.19 |
C# #warning #error 월요일을 기분좋게! (0) | 2013.01.28 |