2010-01-19 6 views
1

거대한 Win32 GUI 응용 프로그램을 디버깅하려고합니다. 전체 소스가 여러 프로세스로 나뉘어져 있습니다. 문제는 다음과 같습니다. 한 프로세스에서 목록 상자가있는 대화 상자가 표시됩니다. 목록 상자에서 항목을 두 번 클릭하면 다른 프로세스가 시작되어 앞쪽으로 이동하여 초기 대화 상자를 덮는 자체 창을 만듭니다. (아직 완전히 이해할 수 없기 때문에 아직 설명 할 수없는) 조작을하면 초기 대화 상자가 작업 표시 줄에서 깜박이기 시작합니다. 정확히 어떤 경우 WM_ACTIVATE가 전송됩니까?

나는 마이크로 소프트 스파이를 시도 ++ 내가 조작 WM_ACTIVATE이 대화로 전송 그렇게 할 때마다, 시대의 대부분은 이러한 매개 변수가 있음을 참조하십시오
fActive: WA_INACTIVE fMinimized:False hwndPrevious:(null) 

그 경우에

대화가 깜박이기 시작하지 않습니다 . 그러나 잠시 동안 매개 변수는

fActive: WA_ACTIVE fMinimized:False hwndPrevious:(null) 

이고 정확히 깜박이는 대화 상자에 해당합니다. 윈도우가 마우스 클릭 이외의 다른 방법으로 활성화

MSDN says WM_ACTIVATE은 WA_ACTIVE 함께 전송됩니다 (예를 들어, SetActiveWindow 함수 또는 키보드 인터페이스를 사용하여 호출하여 창을 선택합니다).

이제 응용 프로그램 코드에서 SetActiveWindow()는 호출되지 않으며 Windows 전환이 가능한 키보드로는 아무 것도하지 않습니다.

WA_ACTIVE와 함께 WM_ACTIVATE를 보내는 다른 이유는 무엇입니까?

답변

3

SetForegroundWindow()이 문제의 원인입니다. 그녀가 다른 앱에서 활발하게 작업하는 동안 프로세스가 사용자의 얼굴에 창을 밀어 내지 못하도록 방지하는 카운터 조치가 있습니다.

SetForegroundWindow()은 두 번째 프로세스가 창을 생성하고 암시 적으로 그 프로세스를 포 그라운드로 가져 오려고 할 때 발생합니다. (당신이 "전면에 가져왔다"라고 말했을 때).

첫 번째 응용 프로그램은 AllowSetForegroundWindow()이라고 불러야합니다. "괜찮아요, 저 창에서 전경 활성화를 취할 수 있습니다."

  • 사용자가 목록 상자 항목을 클릭 :이 작업을 수행 할 경우, 사용자가이 상황에 실행할 수

    참고.

  • 두 번째 프로세스는 시작이 느립니다.
  • 사용자가 첫 번째 응용 프로그램에서 다른 것을 클릭합니다. (잃어버린 인내.)
  • 두 번째 프로세스는 첫 번째 응용 프로그램에서 전경을 도용합니다. (사용자가 다른 작업을 수행 중이므로 좌절감을 느낍니다.)

현재 코드에서 깜박이는 상황이 있습니다. 창 관리자는 사용자가 두 번째 프로세스를 기다리지 않고 첫 번째 프로세스에서 다른 작업을 시작했음을 감지 했으므로 결국 전경을 훔치려 고 시도 할 때 두 번째 프로세스를 차단합니다.

0

WS_VISIBLE 스타일의 창을 만들면 창이 생성 될 때 활성화됩니다.

당신이 창을 활성화하는 ShowWindow(SW_SHOW) (사용 SW_SHOWNA 대신)

당신이 SWP_NOACTIVATE 플래그없이 SetWindowPos을 할 경우는, 창이 활성화됩니다한다면.

마지막으로 템플릿 (CDialog)이있는 창을 만들면 창이 항상 활성화됩니다.

+0

대화 상자의 경우 활성화 된 것을 막을 수 있습니다. OnInitDialog에서 FALSE를 반환해야하고 대화 상자가 WS_VISIBLE 스타일이 아닌 모덜리스로 만들어 져야하고 ShowWindow로 표시해야합니다. (SW_SHOWNA) – Hyksos

관련 문제