2016-06-30 9 views
-1
m_pMainWnd->SetForegroundWindow(); 
m_pMainWnd->SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 

위의 행을 사용하여 내 창 중 하나를 맨 위로 가져 왔습니다. 그러나 실망 스럽지만 아무 일도 일어나지 않습니다. < &을 사용하고 있지만 CWnd :: wndTopMost>는 창을 최상위로 가져 오지만 초점은 없습니다. VS15, mfc왜 창문이 위로 올라 오지 않는지, setwindowpos를 사용하여 감탄합니까?

+0

'SetForegroundWindow'의 제한 일 수 있습니까? 즉, 작업 표시 줄 항목이 대신 깜박입니까? –

+0

예, 깜박이지만 극복 방법은 무엇입니까? –

+2

사용자가 창을 Z 순서의 맨 위에두기를 원하면 창으로 전환합니다. 프로그래머는 바탕 화면의 모든 창을 정렬하는 것이 아니라 응용 프로그램 내에서 * 창 정렬 만 제어합니다. –

답변

-2

CWnd :: wndTopMost 대신 CWnd :: wndTopMost 사용해야합니다. CWnd :: wndTopMost는 비활성화 된 경우에도 창을 맨 위에 유지합니다.

참조 문서 : 둘 사이의 차이에 https://msdn.microsoft.com/en-us/library/a1yzfz6d.aspx

오래된 새로운 것은 기사 : https://blogs.msdn.microsoft.com/oldnewthing/20051121-10/?p=33263

+0

TopMost는 상단에 창을 고정하므로 다른 응용 프로그램이 실행될 때 이전 창은 그대로 남아 있습니다. 이는 허용되지 않습니다. 내가 원하는 것은 내 앱이 시작될 때 최상위에 있어야하고 열어야하지만 등록 대화 상자가 백그라운드로 들어온다는 것입니다. –

+1

또 다른 관련 올드 뉴 사의 기사 : [덮어 쓰지 않은 최상위 창을 만드는 방법은 무엇입니까? 다른 최상위 창에서?] (https://blogs.msdn.microsoft.com/oldnewthing/20110310-00/?p=11253/) –

+0

나는 실제 질문을 오해 한 것 같습니다. 혼란을 피하기 위해 다음 번에 원본 게시물에 세부 정보를 추가로 제공 할 수도 있습니다. – Jonathan

4

미안 해요,하지만 당신이 요구하는 것은 (사소) 할 수 없습니다. 귀하의 응용 프로그램이 포 그라운드 응용 프로그램 (즉, 포 그라운드 윈도우를 담당하는 응용 프로그램)이 아니기 때문에 창이 위로 오지 않는 이유는 응용 프로그램이 포 그라운드 응용 프로그램이 아니기 때문입니다. manual page에서

:

는 정상에 가 SetForegroundWindow 권한이 있어야합니다 창을 소유하는 프로세스를 창을 가져을 SetWindowPos를 사용하십시오.

물론 그렇게했습니다. 그러나 반환 코드를 확인하지 않았습니다. 다음은 man page의 내용입니다.

시스템에서 전경 윈도우를 설정할 수있는 프로세스를 제한합니다. 프로세스는 다음 조건 중 하나에 해당하는 경우에만 전경 창을 설정할 수 있습니다

  • 과정은 전경 과정이다.
  • 프로세스는 포 그라운드 프로세스로 시작되었습니다.
  • 프로세스가 마지막 입력 이벤트를 수신했습니다.
  • 포 그라운드 프로세스가 없습니다.
  • 프로세스가 디버깅 중입니다.
  • 전경 프로세스가 현대 응용 프로그램 또는 시작 화면이 아닙니다.
  • 포 그라운드가 잠겨 있지 않습니다 (LockSetForegroundWindow 참조).
  • 전경 잠금 시간 제한이 만료되었습니다 (SystemParametersInfo의 SPI_GETFOREGROUNDLOCKTIMEOUT 참조).
  • 메뉴가 활성화되어 있지 않습니다.

이러한 제한의 합은 모든 가능성에, 당신은 전경 창으로 창을 끌 수 없습니다, 당신은 앞으로 가져 할 수 있다는 것이다.

주위에는 여러 가지 방법이 있습니다. 포 그라운드 프로세스가 SetForegroundWindow를 호출하는지 확인할 수 있습니다. 불행히도, 그것은 귀하의 코드를 실행하지 않습니다.

한 번만 전 코드를 전경 윈도우 프로세스에 삽입하기 위해 hooks을 사용했습니다. 이것은 초보자의 속임수가 아닙니다. 당신이 그렇게하지 않으면, 당신이하려는 일을 할 수있는 방법이 없습니다.

편집자 추가 : Windows에서 수행하려는 작업을 수행하지 못하게하는 이유가 있습니다. 다른 응용 프로그램에서 포커스를 훔치면 사용자의 UI 경험이 매우 떨어집니다. 님께 서 무엇을 하려는지을 원하시는 지 다시 생각해보십시오.

+0

* "다른 응용 프로그램에서 포커스를 훔치면 사용자의 UI 사용 환경이 매우 열악합니다."- Microsoft가이 동작을 변경 한 이유가 아닙니다. 입력이 전경 창으로 이동하고 전경 창을 훔치는 것은 암호를 훔치는 것을 의미합니다. 게다가 제한 목록은 상당히 부정확하며 수년간 그렇게되었습니다. 그것이 맞다면 모든 메뉴를 닫음으로써 전경 윈도우를 설정하는 것이 쉽다. – IInspectable

+0

왜 MS가 그렇게 만들었는지 이야기하고 있습니다. 당신은 옳을 수도 있고 아닐 수도 있습니다 (결국 동일한 후크 기법이 당신의 암호를 도용 할 것입니다). 나는 왜 당신이 사용자로서, 그것을하지 말아야하는지 이야기하고있다. 할 수는 있지만 그래도 안됩니다. –