반응형
Win32 API : FindWindow( ) 을 이용하여 실행될 MFC 프로그램이 중복으로 실행되지 않도록 확인합니다.
# 개발 환경
운영체제 : Windows 10 Pro 64bit
개발도구 : Visual Studio 2013 Professional
# 사용한 API
#include <WinUser.h>
HWND FindWindowA(
LPCSTR lpClassName,
LPCSTR lpWindowName
);
# 결과

- A, B는 같은 이름으로 된 프로그램
- A 프로그램 실행 중 B 프로그램을 실행할 경우 B 프로그램에서 중복 메시지 출력
# 전체 예제 소스
- OnInitDialog 함수에서 checkRunning( ) 호출
- checkRunning( ) 반환된 값으로 프로그램 중복 처리
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
CString windowTitle = L"Test_program";
bool flagRunning;
for(int i=0; i<50; i++){
if(checkRunning(windowTitle) == false){
flagRunning = false;
break;
}else{
flagRunning = true;
}
}
if(flagRunning == true){
AfxMessageBox(windowTitle + L" is already running.");
exit(1);
}
SetWindowText(windowTitle);
return TRUE;
}
bool CMFCApplication1Dlg::checkRunning(CString windowTitle)
{
HWND hwnd = ::FindWindow(NULL, windowTitle);
CWnd* cwnd = CWnd::FindWindow(NULL, windowTitle);
if (hwnd && ::IsWindow(*cwnd)) return true;
else return false;
}
# 단위 분석
- checkRunning (CString windowTitle)
bool CMFCApplication1Dlg::checkRunning(CString windowTitle)
{
HWND hwnd = ::FindWindow(NULL, windowTitle);
CWnd* cwnd = CWnd::FindWindow(NULL, windowTitle);
if (hwnd && ::IsWindow(*cwnd)) return true;
else return false;
}
- FindWindow(...) 함수를 사용하여 windowTitle 프로그램 이름 변수로 현재 실행된 프로그램 이름들을 비교
- HWND는 윈도우 핸들, CWnd는 MFC클래스
- hwnd와 cwnd가 'true' 인 경우 같은 이름으로 프로그램이 실행되고 있음을 알 수 있음
- 반환 값
- true : 같은 이름으로 프로그램이 실행되고 있음(중복O)
- false : 같은 이름으로 프로그램이 실행되고 있지 않음(중복X)
- SetWindowText
SetWindowText(windowTitle);
- 프로그램 캡션(caption) 이름 변경 함수
감사합니다.
잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다.
반응형
'Apps. > C & C++' 카테고리의 다른 글
| [C++] IP주소 네트워크 연결 확인 Ping 예제소스 (_popen) (1) | 2023.10.06 |
|---|---|
| [C++/Console] 콘솔창 마우스 드래그 방지 (마우스/키보드 입력 비활성화) (0) | 2022.03.12 |
| [C++/Win32] 변수 값을 파일에 읽고 쓰기 (.ini파일) (0) | 2022.03.06 |