Issue
MFC에서 다이얼로그를 생성하면 내부에 창이 많을 때 가장 최근에 띄운 창을 제일 상단에 띄우기 위해서 TopMost를 설정하게 된다. 그런데 내가 만든 프로그램에서 최상단에 뜨는 것은 괜찮지만 다른 프로그램(ex. 크롬)창을 띄울 때 조차도 최상단에 위치하게 된다. 일반적으로 가장최근에 띄운 프로그램이 최상단에 와야한다.
Solution
다른 창이 띄워지는 것을 감지하고 TopMost설정을 해제해준다. 현재 활성화되어있는 창에서 다른 창이 활성화되는 것을 감지할 수 있다.
1. 클래스 뷰를 켜서 창에 활성화상태 변경을 감지할 수 있는 이벤트 함수를 추가해준다. WM_ACTIVATE 메시지이벤트 함수 추가
2. 현재 프로그램의 창이 비활성화 되었을 때, 다른 프로그램의 창이 활성화되었는지 확인하고 TopMost설정을 해제해준다. 창의 활성화 상태가 달라질 때 OnActivate 함수가 호출된다.
void CAboutDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
HWND hWndForeground = ::GetForegroundWindow(); //활성화된 윈도우의 핸들을 얻어온다.
DWORD myProcessId, curProcessId;
switch (nState) {
case WA_INACTIVE: //현재 창이 비활성화됨
::GetWindowThreadProcessId(GetSafeHwnd(), &myProcessId); //내 프로그램의 ProcessId를 얻어온다.
::GetWindowThreadProcessId(hWndForeground, &curProcessId); //활성화된 윈도우의 ProcessId를 얻어온다.
if (myProcessId != curProcessId) {
//활성화된 윈도우의 프로세스Id가 내프로그램의 ProceesId와 다른지 확인해서
//다른 프로그램이 켜졌음을 감지한다.
//다른 프로그램이 제일 앞에 위치하도록 TOPMOST를 설정해준다.
::SetWindowPos(hWndForeground, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
//현재 다이얼로그의 최상단 설정을 해제한다.
::SetWindowPos(GetSafeHwnd(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
//다른 프로그램도 항상 위에 있으면 안되므로 최상단 설정을 해제한다.
::SetWindowPos(hWndForeground, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
}
CDialog::OnActivate(nState, pWndOther, bMinimized);
}
'◼️MFC' 카테고리의 다른 글
[MFC] 창 최소화 (0) | 2023.11.29 |
---|---|
[MFC] LNK1104 ... .exe 파일을 열 수 없습니다. 오류 대처 (0) | 2023.11.03 |
[MFC] 버튼하나로 창 크기 조절하기 (0) | 2023.09.04 |
[MFC] CArray 동적 할당, 해제 (0) | 2023.04.25 |
[MFC] 다이얼로그와 클래스 연결 (0) | 2023.02.16 |