2011-03-10 2 views
7

다른 응용 프로그램에서 창을 앞으로 가져오고 싶습니다. 현재 사용하고 있습니다 :활성화하지 않고 다른 앱 창을 앞으로 가져 오는 방법은 무엇입니까?

::SetWindowPos(hwnd, GetForegroundWindow(), 0, 0, 0, 0, SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); 

괜찮 았지만 일부 (나에게 알려지지 않은) 경우에는 창을 항상 위에 표시합니다. MSDN에 따르면 GetForegroundWindow() 대신 HWND_NOTOPMOST을 사용해야하지만 작동하지 않습니다.이 창은 다른 창 (항상 맨 위에있는 것은 아닙니다) 아래에 있습니다.

어떻게 활성화시키지 않고 창을 앞으로 가져올 수 있습니까?

+0

문서는 'HWND_NOTOPMOST' "가 이미 윈도우가 최상위가 아닌 창이면 효과가 없다고 말합니다." –

+0

일부 대안은 다음과 같습니다. http://stackoverflow.com/questions/916259/win32-bring-a-window-to-top –

+0

* 다른 질문에 대한 제안 된 답변 중 아무 것도 * 좋은 해결책이 아닙니다. 그 전체 질문은 엉망입니다. 데이비드가 당신의 대답을 얻었습니다. –

답변

11

다른 응용 프로그램의 창을 일시적으로 '최상위'먼저 SetWindowPos 전화에 'hWndInsertAfter'로 HWND_TOPMOST을 지정하여 다음 두 번째 통화에 HWND_NOTOPMOST를 지정하여, 그것을 활성화하지 않고 앞으로 가져옵니다 (두 통화를 할 수있다 'uFlags'에 SWP_NOACTIVATE). 이미 작업의 결과로 맨 위에있는 윈도우의 최상위 스타일을 제거 할 위험이있는 경우 GetWindowLong[Ptr]으로 사전에 WS_EX_TOPMOST 전 스타일을 테스트 할 수 있습니다.

다른 응용 프로그램의 창 앞에 있어야하는 특정 창 (모든 창 앞에있는 것과 반대)이 있으면 해당 창 소유자를 다시 일시적으로 앞에 있어야하는 창으로 설정할 수 있습니다 . 을 GWL_HWNDPARENT으로 사용하면 창 원래 소유자를 저장 한 다음 을 HWND_TOP으로 호출 한 다음 임시 소유자를 설정하고 원래 소유자를 다시 SetWindowLong[Ptr]으로 복원하기 위해 SetWindowLong[Ptr]을 호출 할 수 있습니다.

+0

창이 입력 포커스가 없을 때이 기능이 작동합니까? –

+0

@David - 예, W7에서 테스트했습니다. 나는 그것을 활성화하지 않고 위에 메모장 창을 가져올 수 있습니다. –

관련 문제