여러 스레드에서 Windows가있는 복잡한 WPF 응용 프로그램이 있습니다. 꽤 재현 할 수 있듯이, 새 창을 열고 닫을 때 포커스 (활성화)가 마지막으로 활성화 된 창으로 돌아 가지 않습니다. 대신 (보통) 오래된 창이 활성화됩니다. 워크 플로우는 "창 A에서 작업", "A에서 B 창, C 창", "B에서 C 작업", "B 창에서 D 창 열기", "D 닫기"이므로 포커스를 되돌리려면 windows가 필요합니다. B로 이동하지만 실제로는 A로 이동합니다.WPF에서 윈도우 정품 인증 이벤트의 출처 확인
Window.Activated 및 Window.Deactivated 이벤트에 대한 스택 트레이스를 이미 살펴 봤지만 WPF 인프라에서 직접 가져온 것으로서 단서를 보여주지는 않습니다. 나는 이미 Spy ++를 사용해 봤지만 그 유용성은 제한적이다.
어떻게 더 디버깅 할 수 있습니까?
업데이트 : D를 생성 할 때 B 스레드를 더 이상 차단하지 않은 후에 현상이 사라졌습니다. 스레드가 메시지 펌프를 차단할 때 데스크톱 창 관리자가 혼란스러워하는 경우가있는 것 같습니다. 나는 메시지 펌프 차단기를 D를 만들기 전에 배경 우선 순위를 가진 Dispatcher에 밀어 넣음으로써이 문제를 해결했습니다. 이는 DWM 혼동을 해결하고 Windows 활성화가 더 이상 작동하지 않는 것으로 보입니다. 나는 여전히 더 심층적 인 해결책/분석에 대한 지침에 관심이있다.
아마도 Snoop이 도움이됩니다. http://snoopwpf.codeplex.com/ Snoop은 WPF 응용 프로그램을위한 매우 강력한 스파이 도구입니다. – Christian
스눕은 이벤트 정보를 표시하지 않으며 WPF 외부에있는 이벤트 소스를 믿습니다. –