API

윈도우 프로시져

디버그정 2008. 8. 15. 20:31

윈도우 프로시져

- 메시지 처리함수

- CALLBACK 함수 -> SendMessage로 간접 호출

- 재진입 가능

  - WM_LBUTTONDOWN 처리 중에 WM_PAINT 처리 가능

  - 가급적 지역 변수 사용 자제


큐메시지

- 주로 사용자의 입력으로부터 발생되는 메시지


비큐메시지

- 메시지 큐에 들어가지 않고 곧바로 윈도우 프로시저로 보내지는 메시지

- 대부분의 윈도우즈 메시지


시스템 메시지 큐

- 시스템 전체에 유일한 메시지 큐


쓰레드 메시지 큐


시스템 메시지 큐 -> 쓰레드 메시지 큐 -> 윈도우 프로시져


시스템은 쓰레드를 생성할 때 디폴트로 메시지 큐를 가지지 않는 쓰레드를 만든다.


GetMessage(메시지, 윈도, 필터맥스, 필터민)

- 메시지 큐에서 메시지 제거하고 TRUE 리턴

- WM_QUIT이면 FALSE 리턴

- 나머지 인자들은 메세지를 골라서 가져오는 필터링에 사용

- 윈도핸들 -> 특정 윈도와 차일드용 메시지만, 널값이면 현재 쓰레드 속한 모든 윈도우 메시지

- 새로운 메시지가 들어올 때까지 리턴 하지 않음

- 무한대기 -> 한가롭게 놀고 있다.(데드타입)


PeeKMessage()

- 메시지가 있다 -> TRUE 리턴

- 메시지가 없다 -> FALSE 리턴

- 즉시리턴 -> 메시지가 없을 때 다른 일 가능


for(;;) {

    if(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) {

        if(Message.message == WM_QUIT) break;

        TranslateMessage(&Message);

        DispatchMessae(&Message);

     }

     else {

        Other Work..........

     }

}



PostMessage(HWND hWnd, UINT message)

- hWnd의 메시지 큐에 집어 넣음

- 언제 처리 될지 에측 힘듦

- 자신의 쓰레드 메시지 큐에 메시지를 집어 넣는다.


PostMessageThread()

- 다른 쓰레드의 메시지 큐에 메시지를 넣을 수 있다.


* SendMessage() 는 메시지큐를 거치지 않고 메시지를 전달한다.

  - SendMessage()는 메시지를 전달하고 리턴을 할때까지 블럭된다.


메시지데드락

- SendMessage()는 윈도우 프로시져가 리턴하기 전까지는 리턴하지 않음

- 일종의 명령 -> 서브 루틴 호출과 대등

* SendMessage()를 같은 쓰레드 내의 윈도우 끼리 메시지를 주고 받을 때는 데드락이 발생하지 않는다.

  -> 메시지 박스의 메시지 펑핌에 의해 가능

  -> 반면 서로 다른 윈도우라면 SendMessage()를 했을 시 블럭이 된다.


- 해결방법

  - ReplayMessage() : 메시지를 받은 쪽에서 즉시 리턴해주고 다음 작업을 계속하는 것

  - SendNotifyMessage() : Notify메시지 전용

  - SendMessageTimeout() : 타임을 걸어서 그 시간내에 응답이 없으면 리턴하여 계속 처리


  - SendMessageCallback()

    - 상대방에게 메시지를 보냈을 때 상대방이 작업을 제대로 수행했는지 결과가 필요하거나 상대방이 작업을 끝냈을 때,

      다른 처리할 일이 있는데, 내가 블럭이 되고 싶지 않을 때 사용.

      -> CallBack 함수를 만들어서 상대방이 작업이 처리하고 나서 리턴하면 내가 만들어 넣은 CallBack 함수를 호출한다.


브로드캐스팅

- 실행중인 모든 윈도우에게 메시지ㄹ 방송

- 모든 프로세스가 영향을 받는 중대한 변화가 생겼을 때 (예, 장치추가)

이 포스트를..