2011-08-27 4 views
3

메시지 큐에서 창 메시지의 우선 순위를 프로그래밍 방식으로 확인하는 방법이 있습니까?창 메시지의 우선 순위 결정

예 : 일부 창 메시지, WM_PAINTWM_TIMER이 가장 낮은 우선 순위를 가지며 우선 순위가 가장 높은 메시지 뒤에 배치됩니다.

두 메시지 중 어느 메시지가 가장 낮은 우선 순위 또는 가장 높은 우선 순위를 갖거나 어떤 메시지가 처음 또는 마지막으로 보내지는지 확인할 수있는 무언가를 찾고 있습니까?

+2

가능한지 여부에 관계없이 메시지의 순서에 따라 API 계약의 적용을받지 않는 항목을 사용하고 있습니다. 이로 인해 프로그램이 차기 버전의 Windows (또는 WINE과 같은 다른 구현)에서 손상 될 위험이 있습니다. 하지 마. –

답변

17

그것은 작동 방식이 아닙니다. Windows 메시지에는 우선 순위가 붙어 있지 않습니다. 대부분 메시지가 생성되는 방식에 따라 결정됩니다. 메시지 루프는 순서로 메시지를 전달합니다

  • 첫 번째()가 호출이에,
  • 다음 만든 PostMessage를 함께 생성 된 메시지()와 저장된 순서대로 파견 sendMessage 첨부로 생성 된 메시지 큐 대기열 순서대로 메시지 대기열
  • 다음으로 창 상태에서 합성 된 모든 메시지. WM_TIMER, WM_PAINT 및 WM_MOUSEMOVE가이 범주에 해당합니다.

'창 상태에서 합성 됨'절은 WM_PAINT 및 WM_TIMER의 우선 순위가 낮게 표시되는 것입니다. 그리고 마우스를 빠르게 움직여도 메시지 대기열에 마우스 메시지가 넘치지 않는 이유는 무엇입니까? 그러나 배타적이지는 않습니다. 예를 들어 UpdateWindow()를 호출하여 WM_PAINT 메시지를 보내 강제로 '높은 우선 순위'로 전달할 수 있습니다.

+1

합성 된 메시지의 개념을 알지 못했습니다. 내가 더 많이 알 수있는 곳을 아십니까? 나는 Petzold를 읽었으나 나는 그러한 뉘앙스에 대해 언급하지 않았다. –

+1

@David - 죄송합니다. 이것은 10 년 반 전에 읽은 자료입니다. 나는이 잡지가 출판 된 것을 기억하지 못한다. 그들은 오래 전에 사라져 버렸다. –

+1

@David : WM_TIMER, MSDN docs http://msdn.microsoft.com/en-us/library/ms644902(v=vs.85).aspx - "메시지가 GetMessage 또는 PeekMessage 함수에 의해 게시됩니다."는 의미입니다. 실제 타이머가 만료되어 대기열에 직접 게시되는 것이 아니라 필요할 때마다 생성됩니다. 비슷한 문구가 WM_PAINT와 함께 존재하는 것처럼 보입니다. 또한 http://support.microsoft.com/kb/96006은 "WM_TIMER 및 WM_PAINT 메시지는 부울 토글로 생각할 수 있습니다."라고 설명합니다. 나는 그것이 Petzold에 있다고 생각하지 않지만 Raymond Chen의 블로그에 한 번 등장합니다. – BrendanMcK