|
[リスト12-5] :
#include <tlhelp32.h> BOOL FindAnotherProcess( void ) { HANDLE hKernel; HANDLE (WINAPI *pfnCreateToolhelp32Snapshot)( DWORD, DWORD ); BOOL (WINAPI *pfnProcess32First)( HANDLE, LPPROCESSENTRY32 ); BOOL (WINAPI *pfnProcess32Next)( HANDLE, LPPROCESSENTRY32 ); hKernel = GetModuleHandle( "KERNEL32.DLL" ); if( !hKernel ) return FALSE; (FARPROC&)pfnCreateToolhelp32Snapshot = GetProcAddress( hKernel, "CreateToolhelp32Snapshot" ); (FARPROC&)pfnProcess32First = GetProcAddress( hKernel, "Process32First" ); (FARPROC&)pfnProcess32Next = GetProcAddress( hKernel, "Process32Next" ); if( !pfnCreateToolhelp32Snapshot ) return FALSE; int cnt = 0; BOOL fFound = FALSE; HANDLE hSnap = pfnCreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hSnap != (HANDLE)-1 ) { PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); char szMyExe[MAX_PATH]; GetModuleFileName(hInstance, szMyExe, sizeof(szMyExe) ); if( pfnProcess32First( hSnap, &pe ) ) { do { if( lstrcmpi( pe.szExeFile, szMyExe ) == 0 ) { cnt ++; if( cnt >= 2 ) { fFound = TRUE; break; } } } while( pfnProcess32Next( hSnap, &pe ) ); } CloseHandle( hSnap ); } return fFound; //TRUE:同じプロセスが存在する FALSE:存在しない }もしかしたら,FindWindow()するよりもかなり遅いかもしれないので,FindWindow()してウィンドウが見つからなかった場合にのみ,念のためやっておく程度にすることをお勧めします(リスト12-6).
[リスト12-6] :
HINSTANCE hInstance; int WinMain( HANDLE hInstance, HANDLE, LPSTR lpCmdLine, int nCmdShow) { ::hInstance = hInstance; HWND hwndFound = FindWindow( szClassName, NULL ); if( hwndFound == NULL ) { if( FindAnotherProcess() ) { return 0; } } else { SetForegroundWindow( hwndFound ); return 0; } : : }