[C#] Post Message (Send Message, Receive Message) 예제 자료

C#에서 메시지를 보내고 받는 방법에 대한 예제 자료입니다. 다음과 같은 목차로 진행하도록 하겠습니다. 😘

  • Windows Message
  • Post Message (Send)
  • Receive Message(WndProc callback function)

Windows Message

Windows Message는 user32.dll을 이용하여 윈도우 오브젝트 간 통신을 할 수 있도록 지원하는 기능입니다.
이번 예제는 PostMessage 함수를 이용하여 메시지를 주고받아보겠습니다.

Post Message (Send)

Post Message (Send)

Send Message 함수도 있는데, 이번 예제는 PostMessage로 하겠습니다.

  • HWnd : 윈도우 창의 메모리 주소입니다(리소스의 메모리 어드레스) 예제는 ReceiveBeomSang 윈도우를 찾습니다.
  • WParam : Word 매개변수입니다. 예시는 0을 전달합니다.
  • LParam : Long 매개변수입니다. 예시는 12345678을 전달합니다.

public partial class SendBeomSang : Form
{
    const int WM_USER = 1024;

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindow(string className, string windowName);


    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

    public SendBeomSang()
    {
        InitializeComponent();

        Post();
    }

    private void Post()
    {
        Message handle = new Message();
        handle.HWnd = FindWindow(null, "ReceiveBeomSang");
        handle.WParam = (IntPtr)0;
        handle.LParam = (IntPtr)(12345678);

        PostMessage(handle.HWnd, WM_USER, handle.WParam, handle.LParam);
    }

    private void btnPost_Click(object sender, EventArgs e)
    {
        Post();
    }
}

Receive Message(WndProc callback function)

Receive Message

Send 반대말이 무엇일까 하다가 Receive로 임의로 이름을 붙였습니다.
WndProc 콜백 함수를 오버라이드 합니다.
값을 전달받으면 핸들, 메시지, 파라미터를 메시지박스로 표시하였습니다.

public partial class ReceiveBeomSang : Form
{
    const int WM_USER = 1024;

    public ReceiveBeomSang()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {            
        if (m.Msg == WM_USER)
        {                
            Debug.WriteLine($"h={m.HWnd}, msg={m.Msg}, wP={m.WParam}, lP={m.LParam}");
            MessageBox.Show($"h={m.HWnd}, msg={m.Msg}, wP={m.WParam}, lP={m.LParam}");
        }
        base.WndProc(ref m);
    }
}

댓글