Window/WPF2010. 7. 11. 15:26

윈도우 이벤트를 가로채기 위해서 HwndSource.AddHook 방법을 많이 사용하지만 이 방법은

조금 느린 반응과 HwndSource.FromHwnd 로 얻어낸 HWND 윈도우에서 발생하는 메시지만 수신된다는 단점이 있는데요.
 
이 단점이 없는 방법으로 ComponentDispatcher.ThreadMessage 가 있습니다.

사용법은 다음과 같습니다.
 

  private void Window_Loaded(object sender, RoutedEventArgs e)

 {

    ComponentDispatcher.ThreadFilterMessage +=

       new ThreadMessageEventHandler(ComponentDispatcher_ThreadFilterMessage);

 }



void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled)

{

   switch (msg.message)

   {

        // To do

   }

}

 
Win32의 메시지와 동일한 값으로 필요한 메시지들을 다음과 같이 정의하여 비교하시면 됩니다.
 

uint WM_CREATE = 0x0001;

uint WM_DESTROY = 0x0002;

uint WM_MOVE = 0x0003;

uint WM_SIZE = 0x0005;

 

참고로 윈도우의 핸들은 다음과 같이 얻어 올 수 있습니다.

IntPtr hwnd = new WindowInteropHelper(this).Handle;

Posted by 열ㅇl