2010-03-29 11 views
6

워터 마크 기능을 추가하려면 TextBox 컨트롤을 확장하려고합니다. CodeProject에서 찾은 예제는 가져온 SendMessage 함수를 사용하고 있습니다. WndProc을 보호 사용하지 왜 궁금하네요SendMessage 대 WndProc

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 

void SetWatermark() 
{ 
    SendMessage(this.Handle, 0x1501, 0, "Sample"); 
} 

대신

void SetWatermark() 
{ 
    var m =new Message() { HWnd = this.Handle, Msg = 0x1501, WParam = (IntPtr)0, LParam = Marshal.StringToHGlobalUni("Sample") }; 
    WndProc(ref m); 
} 

모두 잘 작동하는 것 같다. 인터넷에서 보았던 거의 모든 예는 SendMessage 기능을 사용합니다. 왜 그런가요? 을 대체하도록 설계된 기능이 WndProc이 아닙니까?

P. stringIntPtr으로 변환 할 수 있는지 알 수없고 Marshal.StringToHGlobalUni이 작동하는 것으로 나타났습니다. 이것을하는 것이 올바른 기능입니까?

답변

11

WndProcSendMessage을 대체하지 않으므로 WindowProc과 동일합니다. WndProc은 응용 프로그램의 메시지 펌프 (SendMessage 또는 PostMessage에 의해 보내거나 게시 된 메시지를 받아 처리)에서 호출됩니다. WndProc을 직접 호출하면 WM_PAINT 메시지를 번들하는 등 Windows에서 수행하는 특수 메시지 처리를 우회하여 응용 프로그램 내의 창에 예상되는 순서대로 메시지가 표시되지 않는 문제를 일으킬 수 있습니다.

MSDN에 명시된 바와 같이

,

모든 메시지는 PreProcessMessage 방법을 통해 필터링지고 이후의 WndProc 방법으로 전송됩니다.

WndProc 메서드는 Windows WindowProc 함수에 정확하게 에 해당합니다. Windows 메시지 처리에 대한 자세한 내용은 MSDN 라이브러리의 WindowProc 함수 설명서 ( http://msdn.microsoft.com/library)를 참조하십시오.

직접 호출하면 시스템에서 전처리 또는 해당 메시지의 다른 처리를 수행 할 기회가 박탈됩니다. .NET 프레임 워크는 Windows의 최상위에서 실행되며 메시지를 보내거나 게시하지 않아도 기본 시스템에서 해당 메시지를 처리 ​​할 수 ​​없으므로 기본 시스템에서 수행 할 수있는 모든 작업을 수행하지 못합니다.

관련 문제