如何只运行一个实例

怎么只运行一个实例
网上找了些帖子
说这样子HWND hWnd = FindWindow(NULL, _T("TestTree"));
if(IsWindow(hWnd))
{
ShowWindow(hWnd, SW_NORMAL);     // 显示
SetForegroundWindow(hWnd);       // 激活
return FALSE;
} 不太明白
放在OnInitDialog()中也没有效果,求大神们讲讲有什么好的办法!!
实例

------解决方案--------------------
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow) {
//...
#ifdef SINGLE_INSTANCE
    HANDLE hMutex;
    hMutex = CreateMutex(NULL, FALSE, "MySigleInstance" );
    if ( WaitForSingleObject(hMutex, 1000) == WAIT_TIMEOUT ) {
        // There is another instance out there, but it is taking to long to
        // locate, just exit
        return FALSE;
    }
    if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
        ReleaseMutex(hMutex);
        return FALSE;
    }
#endif
//...
#ifdef SINGLE_INSTANCE
    ReleaseMutex(hMutex);
    CloseHandle(hMutex);
#endif
    return 0;
}


------解决方案--------------------
以MFC对话框程序为例,在App类定义如下变量和函数
//添加的标识只运行一次的属性名
CString  g_szPropName = "MyAppName";   //自己定义一个属性名
HANDLE   g_hValue = (HANDLE)1;               //自己定义一个属性值

BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
HANDLE h = GetProp(hwnd,g_szPropName);
if( h == g_hValue)
{
*(HWND*)lParam = hwnd;
return false;
}
return true;
}

在InitInstance()中添加如下代码
	HWND oldHWnd = NULL; 
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);    //枚举所有运行的窗口 
if(oldHWnd != NULL) 

::ShowWindow(oldHWnd,SW_SHOWNORMAL);          //激活找到的前一个程序 
::SetForegroundWindow(oldHWnd);                //把它设为前景窗口