선언:

C#

[DllImport("user32")]
public static extern Int32 SendMessage(IntPtr hWnd, Int32 uMsg, IntPtr WParam, IntPtr LParam);


VB.NET

<DllImport("user32")> _
Public Shared Function SendMessage(hWnd As IntPtr, uMsg As Int32, WParam As IntPtr, LParam As IntPtr) As Int32
End Function




사용 예제:

C#

void Button1Click(object sender, EventArgs e) {
    // 텍스트박스1 의 텍스트 길이를 가져온다.
    Int32 textLength = SendMessage(textBox1.Handle, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);
    
    // 260 바이트 만큼 메모리 공간을 할당한다.
    IntPtr textPtr = Marshal.AllocHGlobal(260);
    
    // 텍스트박스1 의 텍스트를 textPtr 에 저장한다.
    SendMessage(textBox1.Handle, WM_GETTEXT, new IntPtr(260), textPtr);
    
    // 포인터를 유니코드 문자열로 변환한다. 
    String text1 = Marshal.PtrToStringUni(textPtr, 260);
    
    // 텍스트박스2 에 텍스트박스1 의 텍스트를 입력한다.
    SendMessage(textBox2.Handle, WM_SETTEXT, IntPtr.Zero, textPtr);

    // 사용이 끝난 포인터는 메모리에서 해제해준다.
    Marshal.FreeHGlobal(textPtr);            
}


VB.NET

Private Sub Button1Click(sender As Object, e As EventArgs)
    ' 텍스트박스1 의 텍스트 길이를 가져온다.
    Dim textLength As Int32 = SendMessage(textBox1.Handle, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero)

    ' 260 바이트 만큼 메모리 공간을 할당한다.
    Dim textPtr As IntPtr = Marshal.AllocHGlobal(260)

    ' 텍스트박스1 의 텍스트를 textPtr 에 저장한다.
    SendMessage(textBox1.Handle, WM_GETTEXT, New IntPtr(260), textPtr)

    ' 포인터를 유니코드 문자열로 변환한다. 
    Dim text1 As [String] = Marshal.PtrToStringUni(textPtr, 260)

    ' 텍스트박스2 에 텍스트박스1 의 텍스트를 입력한다.
    SendMessage(textBox2.Handle, WM_SETTEXT, IntPtr.Zero, textPtr)

    ' 사용이 끝난 포인터는 메모리에서 해제해준다.
    Marshal.FreeHGlobal(textPtr)
End Sub




예제 실행 결과:




매개 변수 설명:

hWnd - 메세지를 통지받을 윈도우를 입력합니다.

uMsg - 보낼 메세지를 입력합니다.

WParam, LParam - 메세지에 대한 추가 정보를 입력합니다.




API 설명:

지정된 윈도우 또는 컨트롤에 메세지를 보냅니다.




참고:

SendMessage (MSDN)




비고:

메세지의 종류는 다양합니다. 일반적인 윈도우 및 컨트롤에 대한 메세지는 0x0000 부터 0x0399 까지로 설정되어 있는데요.

0x0400 부터는 WM_USER 이란 메세지로, 메세지 이름 그대로 사용자 정의 메세지를 정의하라고 해놨습니다.

(이렇게 해놓은 이유는 값이 같은 메세지간의 충돌을 방지하기 위함이겠죠)


메세지는 버튼에 대한 메세지, 텍스트박스에 대한 메세지, 리스트뷰에 대한 메세지 등등 매우 다양하고, 사용 방법도 매우 다양합니다. MSDN 페이지에는 내용이 다소 빈약해서 링크는 안하겠습니다. 하지만, 메세지에 대한 것은 pinvoke.net 에서도 찾아볼 수 있고, C/C++의 경우 헤더 파일을 찾다 보면 나오기 마련입니다.

(꼼수로는, #include <windows.h> 하신 후에 자동 완성 기능으로 WM_NULL 메세지가 정의된 곳으로 가도 되지요..)


각 메세지별로 WParam, LParam을 사용하는 것도 있고, 사용하지 않는 것도 있으니 메세지에 대한 충분한 정보를 갖추신 후에 사용하셔야 만족할 만한 결과를 얻으실 수 있습니다. 그리고 WParam, LParam 에 결과 값을 저장하는 메세지도 있고 SendMessage API의 반환 값이 결과 값이 되는 메세지도 있습니다.




프로젝트 파일:

C#.zip

VB.NET.zip

'API Reference' 카테고리의 다른 글

34. GetWindowsDirectory  (0) 2014.10.24
33. GetSystemDirectory  (0) 2014.10.23
31. SetWindowLong  (0) 2014.10.11
30. GetWindowLong  (0) 2014.10.10
29. SetWindowTheme  (0) 2014.10.09

+ Recent posts