2011-03-03 4 views
1

내 WTL C++ 응용 프로그램이 활성화되거나 키보드 포커스가 생기면 이전에 활성화되었거나 포커스가있는 응용 프로그램의 창 핸들을 결정해야합니다. 그러나 WM_SETFOCUSWM_ACTIVATE 메시지의 창 핸들 (LPARAM)은 모두 NULL (XP, 32 비트)입니다.WM_SETFOCUS, 방금 초점을 잃은 응용 프로그램을 얻으십시오

응용 프로그램이 활성화되었을 때 초점을 잃은 응용 프로그램을 어떻게 확인할 수 있습니까? 이 작업을 수행하는 간단한 방법이 있습니까? 아니면 특수 CBT 후크를 굴려야합니까?

답변

4

메시지를 보내고 매개 변수를 확인하는 쉬운 방법은 Spy ++를 시작하고 Alt + Tab을 사용하여 다른 창으로 이동하는 동안 로그 메시지로 설정하는 것입니다. 이전의 활성 창 (또는 활성 인 창) 동일한 스레드에 있지 않을 때

당신이 발견 한 것과 일치

, 모두 WM_SETFOCUSWM_ACTIVATE에 대한 lParamNULL 될 것입니다.

David가 제안한대로 WM_ACTIVATEAPP으로 운이 더 좋을 수도 있습니다. 스레드 식별자를 얻은 다음 GetGUIThreadInfo function을 호출하여 해당 스레드의 활성 창을 확인할 수 있습니다. 이 함수는 호출중인 프로세스가 활성 창을 소유하지 않은 경우에도 작동합니다.

귀하의 앱이 사용자가 오랫동안 열어 두지 않을 것으로 예상되는 작은 유틸리티 이외의 것이라면 잠재적 인 성능 영향을 고려할 때 가능하면 CBT 후크를 사용하지 않아도됩니다. 불행히도 이러한 프로세스 경계를 ​​넘나 드는 상호 작용은 어렵습니다.

Windows의 이후 버전에서 작동하지 않을 물건을 두려워하지 않는다면 RegisterShellHookWindow function을 조사 할 수 있습니다. 내가 직접 사용하지는 않았지만 그것에 대해 많이 말할 수는 없지만, 훅을 설치하여 셸 메시지를 얻는 것이 더 쉬운 방법입니다.
Windows 2000만큼 멀리 돌아 왔지만 XP SP1이 출시되기 전까지는 SDK에 포함되지 않았습니다. 내가 말할 수있는 한 Windows Vista 및 7에도 여전히 존재합니다.

+0

+1 'RegisterShellHookWindow'에 대해 잊어 버렸습니다. 나는 내 앱의 .chm 도움말 파일이 닫힐 때이를 감지하여 크기와 위치를 기억하고 다시 시작할 때이를 복원 할 수 있도록 앱에서 사용합니다. 빨간색 경고 텍스트는 상당히 걱정 스럽지만 XP에서 7까지 잘 작동합니다. –

관련 문제