2009-04-22 4 views
1

창을 차지하려고 화면을 표시하려고합니다. 이론적으로 GetForegroundWindow()를 사용하여 전경 윈도우를 잡는 지 확인하고 있으므로 윈도우 상단에 아무것도 그려서는 안됩니다.Windows 팝업 감지

그런 다음 GetDC (GetDesktop())를 호출하고 내 창에서 차지하는 화면 영역을 비트 맵에 복사합니다. 내가 대신 내가 제목 표시 줄이나 테두리를하지 않는 (또는 내가 여기서 뭔가를 놓친 거지?)의 GetDC (myWindowHandle)를 호출하면

내 문제는 내가 지금 제대로 내 응용 프로그램이 열리면 어떤 메뉴를 잡아 것입니다 하지만 나는 또한 내 응용 프로그램에 그려진 팝업 (메신저 클라이언트 & Tweetdeck)을 잡아.

팝업이있을 때 true를 반환하지만 16 비트 버전의 Windows와의 하위 호환성을 위해 일반적으로 유용하지는 않은 AnyPopup() 함수를 발견했습니다. 팝업 (및 위치)을 감지하는 간단한 방법이 있습니까? 아니면 모든 윈도우를 순환시켜 차례대로 모든 하위 윈도우를 열거하여 전경 윈도우 상단에 있는지 테스트해야합니까?

답변

0

GetForegroundWindow()는 현재 사용자 입력을받는 윈도우를 반환하지만 반드시 다른 모든 윈도우보다 위에 있지 않아도됩니다. 윈도우는 포커스가 없다고해도 다른 윈도우의 꼭대기가 될 SetWindowPos() 함수로 "최상위"로 설정할 수 있습니다. (이것은 팝업 창이 의미하는 바라고 생각합니다).

HWND_TOPMOST을 두 번째 매개 변수로 사용하여 SetWindowPos()를 호출하여 창을 최상위 창으로 만들 수 있습니다. 창에는 입력 포커스가 있기 때문에 모든 맨 위 창의 맨 위로 이동해야합니다.

창이 자신의 창이 아닌 경우 화면을 그어 본 후에 원래 상태로 되돌려 놓아야합니다. 윈도우가 최상위에 있는지 알아 보려면 GetWindowLongPtr (myWindowHandle, GWL_EXSTYLE)을 호출하고 WS_EX_TOPMOST 스타일이 설정되었는지 확인하십시오.

1

GetDC를 호출하면 클라이언트 영역에 대한 DC가 표시됩니다. 비 클라이언트 영역 제목 표시 줄과 테두리를 포함하여 전체 창에 대한 DC를 얻으려면 GetDCEx을 DCX_WINDOW 플래그와 함께 사용하십시오.

또한, PrintWindow 기능을 사용하면 화면이 가려져 있거나 부분적으로 화면을 벗어난 경우에도 창의 스냅 샷을 찍을 수 있습니다. 완벽하지는 않지만 잘 작동합니다.