minjeong-oh
기록
minjeong-oh
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • ML & Neural Net (3)
    • ◼️GNN (1)
    • ◼️시계열 (1)
    • ◼️추천시스템 (0)
    • ◼️수학 (3)
    • Data Engineer (2)
    • ◼️Spark (1)
    • ◼️Kafka (1)
    • ◼️Elestic Search (0)
    • ◼️Redis (0)
    • ◼️ClickHouse (1)
    • Programming Language (4)
    • ◼️React (0)
    • ◼️Git (1)
    • ◼️Python (1)
    • ◼️C++ (33)
    • ◼️Fortran 99 (2)
    • ◼️OpenGL (7)
    • ◼️MFC (35)
    • ◼️Flutter (46)
    • ◼️Kotlin (1)
    • ◼️Android (1)
    • ◼️Java (1)
    • ◼️C (4)
    • Development (0)
    • ◼️디자인패턴 (0)
    • ◼️네트워크 (2)
    • ◼️인증 (1)
    • Computer Science (4)
    • 알고리즘 문제풀이 (12)
    • SQL 고득점 Kit 문제풀이 (8)
    • 취업준비 (0)
    • Notion 정리 글 (1)
    • Article Scrap (12)
      • Careerly - Q&A (7)
      • Careerly - Post (2)
    • 기타 등등 (16)

블로그 메뉴

  • 글쓰기
  • 홈
  • 태그
  • 방명록
  • 편집

공지사항

인기 글

태그

  • 19년식그램램장착
  • AI배워야하나
  • 리눅스파티션
  • API문서정리
  • 인공지능개발자
  • 이것이C++이다책참고
  • 19년식그램SSD장착
  • mfc
  • GSLB
  • 구조체매개변수
  • 그램업그레이드
  • 티스토리폰트배경색없애기
  • OpenGL회전
  • 그램풀스팩업그레이드
  • hello테마
  • SpringBootSwagger
  • 구조체배열포인터
  • kafka구축
  • NextJSSwagger
  • 이차원구조체배열포인터

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
minjeong-oh

기록

[MFC] 다른 프로그램이 켜졌을 때 윈도우 창이 뒤로 가도록 하기
◼️MFC

[MFC] 다른 프로그램이 켜졌을 때 윈도우 창이 뒤로 가도록 하기

2023. 9. 12. 15:45

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

    티스토리툴바