Process 탐지, 중복실행 방지 및 포커스 이동
생계/C/C++ 2007. 3. 19. 20:15 |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;
}
{
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만 검색해도 널려있는 내용이지만, 제대로 파악도 못해 헤매던 시절의 기억을 잊지않기 위해서라도 이곳에 기록을 남긴다.