Notice
Recent Posts
Recent Comments
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

임베디드에서 서버까지

윈도우 메시지(Window Message)의 구조 본문

C#

윈도우 메시지(Window Message)의 구조

코딩 라이언 2018. 12. 3. 22:05

C#은 윈도우 내부 동작에 대한 정확한 이해가 없어도 필요한 기능들을 구현하는데 무리가 없을 만큼 강력한 언어이다. 

하지만 가끔 C#에서 공식 지원하지 않는 기능들(Digital forensic, Low level device 제어 등)을 구현할 때, 마샬링을 통해 WinAPI를 사용할 때가 종종 있다. 이 경우, Google, GitHub 등에서 참고할 정보를 잘 찾는다면 원하는 기능을 구현할 순 있긴 하다.


하지만 윈도우 프로그램이 동작하는 기본 구조에 대해서 이해를 하고 있다면, 직접 만든 프로그램이 어떻게 동작하는지 좀 더 명확하게 알 수 있다.



Window OS는 application에 메세지 형태로 데이터를 전달한다.


키보드/마우스 입력이 어떻게 Application까지 전달되는지 Window 내부 구조를 보고 이해해 보자.




1. 장치 입력이 발생한다.

2. Device Driver에서 이를 처리하고 System Queue로 메세지를 전달한다.

3. RIT(Raw Input Thread)에서 이를 처리하고 프로세스(Application)로 메세지를 전달한다.

4. 프로세스는 RIT에서 전달된 메세지를 Message Loop에서 처리한다. (예전에는 WinAPI 프로그래밍을 할 때, 이 부분도 직접 구현해야 했다.)

5. Message Loop에서 메세지를 각 Window(GUI)를 담당하는 프로시저에 전달한다. 이 때, 메세지의 핸들값에는 Window 정보가 담겨있어, 입력이 발생한 Window를 알 수 있다.


윈도우 내부적으로 대부분의 Event들이 이와 같이 메세지 형태로 처리되고 있다. 메세지를 처리하는 로직이 상용구(보일러 플레이트 코드)처럼 반복되기에 C# 등 상위 언어에서는 이러한 부분을 기본 라이브러리에서 적절히 처리해준다. 즉, C#은 우리가 이 부분에 대해서 신경쓰지 않고 보다 다양한 기능에 집중하여 개발을 할 수 있게 해주는 고마운 언어다.