BOOL CMake3DApp::FindProc()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    BOOL bFindServer = FALSE;
    int imageCount = 0;
    LPCTSTR str = TEXT("Test.exe");
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    DWORD pid = GetCurrentProcessId(); // 자기자신의 PID
    DWORD hProc;

    if(hSnapShot)
    {
        PROCESSENTRY32* processInfo = new PROCESSENTRY32;
        processInfo->dwSize = sizeof(PROCESSENTRY32);
        int index=0;
        while(Process32Next(hSnapShot, processInfo)!=FALSE)
        {
            if(lstrcmpi(str, processInfo->szExeFile) == 0)
            {
                imageCount++;
                // hProc : 이미 실행되어 있는 Test.exe의 PID
                // pid   : 지금 실행되는 Test.exe의 PID
                if(processInfo->th32ProcessID != pid)
                {
                    hProc = processInfo->th32ProcessID;
                }
            }
        }
        CloseHandle(hSnapShot);
        delete processInfo;
    }

    if(imageCount == 1) // 실행시 Test.exe가 하나일 경우만 계속 진행(실행)
    {
        bFindServer = TRUE;
    }
    else
    {
        if(hProc)
        {   
            EnumWindows((WNDENUMPROC)EnumFunc, hProc);
            SetForegroundWindow(hwndMax); // 기 존재한 Test.exe를 최상위로.
        }
    }
    return bFindServer;
}

// EnumWindows callback함수
BOOL CALLBACK EnumFunc(HWND hwnd, LPARAM lParam) // lParm - Test.exe
{                                     // processID - winprocess
    DWORD processID;
    GetWindowThreadProcessId(hwnd, &processID);

    if(processID != DWORD(lParam))
    {
       return TRUE;
    }

    hwndMax = hwnd; // 해당 proc의 handle
    return FALSE;
}


간단한 내용임에도 불구하고,  제대로 사용법을 몰라 헤매었다. 본디 다른 데 사용할려고 여기저기 긁어모아 완성시켰던 것이었는데 이번 프로젝트에 써 먹을 수 있었다. Google만 검색해도 널려있는 내용이지만, 제대로 파악도 못해 헤매던 시절의 기억을 잊지않기 위해서라도 이곳에 기록을 남긴다.

Posted by Master 
: