메시지를 보내고 매개 변수를 확인하는 쉬운 방법은 Spy ++를 시작하고 Alt + Tab을 사용하여 다른 창으로 이동하는 동안 로그 메시지로 설정하는 것입니다. 이전의 활성 창 (또는 활성 인 창) 동일한 스레드에 있지 않을 때
당신이 발견 한 것과 일치
, 모두 WM_SETFOCUS
및 WM_ACTIVATE
에 대한 lParam
는 NULL
될 것입니다.
David가 제안한대로 WM_ACTIVATEAPP
으로 운이 더 좋을 수도 있습니다. 스레드 식별자를 얻은 다음 GetGUIThreadInfo
function을 호출하여 해당 스레드의 활성 창을 확인할 수 있습니다. 이 함수는 호출중인 프로세스가 활성 창을 소유하지 않은 경우에도 작동합니다.
귀하의 앱이 사용자가 오랫동안 열어 두지 않을 것으로 예상되는 작은 유틸리티 이외의 것이라면 잠재적 인 성능 영향을 고려할 때 가능하면 CBT 후크를 사용하지 않아도됩니다. 불행히도 이러한 프로세스 경계를 넘나 드는 상호 작용은 어렵습니다.
Windows의 이후 버전에서 작동하지 않을 물건을 두려워하지 않는다면 RegisterShellHookWindow
function을 조사 할 수 있습니다. 내가 직접 사용하지는 않았지만 그것에 대해 많이 말할 수는 없지만, 훅을 설치하여 셸 메시지를 얻는 것이 더 쉬운 방법입니다.
Windows 2000만큼 멀리 돌아 왔지만 XP SP1이 출시되기 전까지는 SDK에 포함되지 않았습니다. 내가 말할 수있는 한 Windows Vista 및 7에도 여전히 존재합니다.
+1 'RegisterShellHookWindow'에 대해 잊어 버렸습니다. 나는 내 앱의 .chm 도움말 파일이 닫힐 때이를 감지하여 크기와 위치를 기억하고 다시 시작할 때이를 복원 할 수 있도록 앱에서 사용합니다. 빨간색 경고 텍스트는 상당히 걱정 스럽지만 XP에서 7까지 잘 작동합니다. –