반응형

 

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) 이름 변경 함수

감사합니다.

 

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 

 


반응형

+ Recent posts