//OnInitDialog 에서 처음실행할때 확인
HANDLE hEvent;
hEvent = CreateEvent(NULL, FALSE, TRUE, AfxGetAppName()); //어플이름으로 확인
if ( GetLastError() == ERROR_ALREADY_EXISTS) {
AfxMessageBox(_T("Already running.."));
exit(0) ;
}
//실행중인 어플 내부에서 프로그램 띄위기
SHELLEXECUTEINFO sei;
::ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = _T("실행할 프로그램 주소~~~(e.g c:\test.exe");
sei.lpParameters = _T("");
sei.nShow = SW_SHOW;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = _T("open");
DWORD result = :: ShellExecuteEx(&sei);
if(sei.hProcess != NULL)
{
::WaitForSingleObject(sei.hProcess, INFINITE);
}
/// 뮤택스를 이용한 중복실행방지
if(NULL == ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T(STRING_MUTEX_NAME)))
{
// 중복실행이 아니므로 뮤택스 생성
m_hMutex = ::CreateMutex(NULL, FALSE, _T(STRING_MUTEX_NAME));
if(m_hMutex == NULL)
{
AfxMessageBox(_T("프로그램 실행에 실패하였습니다."), MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
}
else
{
// 중복실행일 경우 기존 열려있는 창을 맨 앞으로 보여줌
// 만약, 창이 최소화 상태라면 최소화 상태 해제
CWnd* pWnd = NULL;
pWnd = CWnd::FindWindow(NULL, _T(STRING_CAPTION_NAME));
if(pWnd != NULL)
{
if(pWnd->IsIconic())
pWnd->ShowWindow(SW_RESTORE);
else
pWnd->SetForegroundWindow();
}
else
{
pWnd = CWnd::FindWindow(NULL, _T(STRING_CAPTION_NAME));
if(pWnd != NULL)
{
if(pWnd->IsIconic())
pWnd->ShowWindow(SW_RESTORE);
else
pWnd->SetForegroundWindow();
}
}
return FALSE;
}
////
'Computer Science > Languages' 카테고리의 다른 글
[MFC] 투명 윈도우 만들기 (1) | 2015.09.14 |
---|---|
[Scrap] 시리얼 포트, TCP/IP, UDP/IP 터미널 프로그램 (시리얼 통신 프로그램) (2) | 2015.04.29 |
[C#] 프로세스 강제종료 process force kill (0) | 2015.04.25 |
[MFC] String 문자열 공백 없애기 (0) | 2015.04.20 |
[MFC] BMP 비트맵 투명 그리기 (0) | 2015.02.23 |