문제

Win32 에서는 C++응용 프로그램,우리가 시작하는 메시지가 루프를 가져오는 메시지 큐에서 번역한 그들과 다를 전달합니다.결국,각각의 메시지가 도달하면 우리의 WndProc 는 관련 이벤트를 처리할 수 있습니다.

내가 이해하는 부분입니다.내가 이해하지 못하는 사이에 출입니다.특별히:

  1. 다른 종류의 OS 를 인터럽트 처리기해야 될 메시지를 배치에서 말했다'메시지 큐',하지만 어디에서 프로세스 주소 공간은 이 큐에 거주하는가?어떻게 그것에 노출된 인터럽트 처리기입니까?
  2. 그것은 무엇을 의미하는'번역'메시지?무엇을 전화 TranslateMessage() 정말로?
  3. 한 번에 의해 전달됩 DispatchMessage(), 무엇을,모든 장소는 메시지가 스윙에 의해 도달하기 전에 내 WndProc(i.e무엇 OS 그것으로 하는)?

누구나 알고있는 경우 대한 답변을 위,친절 내 호기심을 충족.감사합니다.

도움이 되었습니까?

해결책

OS 유지하는 메시지 큐,그것을 둔 이벤트가(예를 들어,에서 인터럽트 또는 다른 소스).그 다음에 보내는 메시지 큐에서 모든 windows,에 따라 메시지(예를 들어,그것은 보내지 않을 것입니다 중요한 메시지 창이 없는 집중).

응용 프로그램을 만들 수 있습의 자신의 큐를 처 메시지입니다.그 큐 생성 요청 (필요한 경우에만).

번역 메시지가 사용하는 메시지를 작성되지 않은'진짜'라는 이벤트.예를 들어,WM_CONTEXTMENU 메시지가'번역'중 하나에서 마우스 오른쪽 클릭하거나,컨텍스트 메뉴 key,shift-F10.이 WM_CHAR 번역서 WM_KEYDOWN 메시지입니다.그리고 물론 다른 많은 메시지는'번역'는 방법입니다.

메시지가 게시된 모든 창을 받아야 합니다.OS 결정에 따라 형식의 메시지 여부를 창을 받아야 한다는 메시지가 나지 않습니다.대부분의 메시지는 기다렸다에 의해 시스템,즉 메시지 않을 것을 얻을 게시하는 다른 창을 때까지 그것에 의해 처리된다.이것은 중대한 영향 방송을 위한 메시지:는 경우 하나의 창에서 반환되지 않을 처리할 때 해당 메시지 큐가 과 다른 창을 받지 않을 것이지요.

다른 팁

메시지 전송 방법과 처리 방법에 따라 다릅니다.

SendMessage를 호출 할 때 대상 창이 현재 스레드가 소유하는 경우 호출은 창의 메시지 큐를 우회하고 창 관리자는 대상 창에서 창립 박리를 직접 호출합니다. 대상 창이 다른 스레드가 소유하는 경우, 창 관리자는 대상 창이 창문에서 회복 될 때까지 우편 메이지 및 펌프 창 메시지를 효과적으로 호출합니다.

PostMessage를 호출하면 Window Manager가 메시지 매개 변수를 마샬링하고 대상 창의 메시지 큐에 해당 객체를 삽입합니다. 다음으로 호출하면 getMessage 메시지가 메시지 큐에서 제거됩니다.

Window Manager는 또한 입력 장치 (키보드 및/또는 마우스)의 원시 입력 이벤트에 등록되며 해당 입력 이벤트에 대한 메시지를 생성합니다. 그런 다음 큐의 메시지를 적절하게 삽입합니다 (입력 이벤트의 처리는 창의 메시지 큐에 이미 어떤 메시지가 있는지에 따라 복잡합니다).

Stefan이 지적한 것처럼 TransleMessage는 Accelerator 키를 번역합니다. 예를 들어 키 시퀀스를 WM_COMMAND 메시지로 변환합니다.

다른 종류의 OS 인터럽트 핸들러는 해당 '메시지 대기열'에 메시지를 배치해야하지만 프로세스 주소 공간 내 에서이 대기열은 어디에 있습니까? 인터럽트 핸들러 코드에 어떻게 노출됩니까?

Windows는 스레드와 관련이 있습니다. 창이있는 각 스레드에는 프로세스 주소 공간에 스레드 큐가 있습니다. OS에는 하드웨어 생성 이벤트를위한 자체 주소 공간에 내부 대기열이 있습니다. 이벤트 및 기타 상태 정보 (예 : 창이 초점이 맞는)의 세부 사항을 사용하여 OS는 하드웨어 이벤트를 메시지로 변환 한 다음 적절한 스레드 큐에 배치됩니다.

게시 된 메시지는 대상 창의 스레드 큐에 직접 배치됩니다.

전송 된 메시지는 일반적으로 직접 처리됩니다 (대기열을 우회).

세부 사항은 털이 있습니다. 예를 들어, 스레드 큐는 메시지 목록 이상의 상태입니다. 일부 상태 정보도 유지 관리합니다. 일부 메시지 (WM_Paint와 같은)는 실제로 대기열이 아니지만 대기열을 쿼리하고 비어있을 때 추가 상태 정보에서 합성되었습니다. 다른 스레드가 소유 한 Windows로 전송 된 메시지는 실제로 직접 처리되지 않고 수신기의 대기열에 게시되지만 시스템은 발신자의 관점에서 정기적 인 차단 전송처럼 보입니다. 이것이 교착 상태를 유발할 수 있다면 (원형이 원래 스레드로 돌아가기 때문에) 유쾌함이 계속됩니다.

Jeffrey Richter 책에는 많은 세부 사항이 있습니다. 내 판은 오래되었습니다 (고급 창). 현재 판은 호출되는 것 같습니다 C/C ++를 통한 Windows.

OS는 메시지 스트림을 발신자에게 합리적으로 (비교적 단순하게) 보이게하기 위해 많은 작업을 수행합니다.

메시지를 '번역'한다는 것은 무엇을 의미합니까? TranslAtemessage ()에 대한 호출은 실제로 무엇을합니까?

가상 키 메시지를보고 키 다운/키 업 조합을 인식하면 문자 메시지가 추가됩니다. 전화하지 않으면 TransleMessage, 당신은 wm_char와 같은 문자 메시지를받지 못합니다.

나는 그것이 돌아 오기 전에 직접 캐릭터 메시지를 전송한다고 생각합니다 (게시하는 것과는 달리). 나는 확인한 적이 없지만 WM_CHAR 메시지가 wm_keyup 직전에 도착한다는 것을 기억하는 것 같습니다.

DispatchMessage ()에 의해 발송되면 WNDPROC에 도달하기 전에 메시지는 어떤 모든 장소에서 스윙합니까 (즉, OS는 무엇을합니까?)?

DispatchMessage는 대상 창에 대한 메시지를 WNDPROC에 전달합니다. 그 과정에서 일부 후크는 메시지를 볼 수있는 기회를 얻을 수 있습니다 (그리고 아마도 방해 할 수 있습니다).

마지막 하위 질문을 해결하려면 모든 후크 (WH_CALLWNDPROC)를 통해 파이프를받은 후 발송 된 메시지가 WindowProc로 이동합니다.

이것에 대해 절대적으로 긍정적이지는 않지만 내 가장 좋은 추측은 다음과 같습니다.

  1. 큐는 Win32 API 호출로 액세스하는 시스템 객체입니다. 프로세스 주소 공간에 전혀 없습니다. 따라서 인터럽트 핸들러는 (아마도 커널의 HAL (하드웨어 추상화 레이어)을 통해 액세스 할 수 있습니다.

  2. Win16에서, 그 전화는 더 큰 메시지의 다양한 하위 부분을 가져 와서 전체적으로 으깬다. 따라서 TransleMessage는 해당 WM_Keydown WM_Keyup 시퀀스를 찾을 때 WM_Keypress를 추가합니다. 또한 다양한 버튼 클릭 메시지를 내부 설정과 메시지의 타임 스탬프를 기반으로 DoubleClick 메시지로 클릭됩니다. 그것이 여전히 Win32 에서이 일을하든, 나는 모른다.

  3. DispatchMessage는 아마도 창 메시지 후크가 처리되는 곳일 것입니다. 따라서 창에 고리가 있으면 여기 또는 getMessage가 호출되는 시점입니다. 잘 모르겠습니다. 그 외에 DispatchMessage는 창과 관련된 WNDPROC 주소를 찾아서 호출합니다. 할 일이 많지 않습니다.

도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top