티스토리 뷰
LPARAM 마샬링
SendMessage를 처리할 때나 윈도우 프로시저 처리 시 구조체 Message에 lparam 변수에 구조체 데이터를 실어 보내는 경우가 많다.
이때, lparam이 포인터 타입(IntPtr)이므로 lparam을 대상으로 마샬링을 해야 한다.
만약, 제3의 변수(myIntPtr)를 만들어서 마샬링을 하는 경우 구조체 값을 제대로 전달하지 못한다. (분명 방법이 있을거 같은데 아직은 모르겠다)
프로세스 흐름은 다음과 같다.
- 구조체 선언 (StructLayout., public struct 선언)
- 메시지 처리 후 발생한 프로시저 lparam을 구조체로 마샬링(변환)
- 값 변경 및 추가
- 구조체를 다시 lparam으로 마샬링
- 프로시저(WndProc) Message타입 매개변수 m에서 변경된 lparam 데이터를 가지고 윈도우 프로시저 처리
예시 코드는 다음과 같다.
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_GETMINMAXINFO:
// 메시지 처리 후 발생한 프로시저 lparam을 구조체로 마샬링
MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(m.LParam, typeof(MINMAXINFO));
// 기존 값 변경 및 추가
mmi.ptMaxTrackSize = new POINT(200, 400);
mmi.ptMinTrackSize = new POINT(400, 400);
// 구조체를 다시 lparam으로 마샬링
Marshal.StructureToPtr(mmi2, m.LParam, false);
break;
}
// 윈도우 프로시저 처리
base.WndProc(ref m);
}
댓글