我用一下代码做到了,但我觉得不大好,因为窗口名是可能被其他应用程序重的,不用mutex,还有其他办法吗?还有mfc下的ClassName好像不能改
BOOL CCmApp::InitInstance()
{
// 防止应用程序启动两次
HWND hwnd = FindWindow(NULL, "我的窗口名");
if ( hwnd )
{
SetForegroundWindow( hwnd );
return FALSE;
}         
}

解决方案 »

  1.   

    你这种做法不好一般是这样来处理的首先定义一个全局变量
    #define UNIQUE_NAME "{C7C914E2-46C6-11d4-9059-xxxxxxx}"
    这个值可以从VSTOOL中的工具生成在APP中
    BOOL CXXXXpp::InitInstance()
    {
    HANDLE m_hOneInstance;
    m_hOneInstance=::CreateMutex(NULL,FALSE,UNIQUE_NAME);
    if (GetLastError()==ERROR_ALREADY_EXISTS)
    {
    AfxMessageBox("Program is Already Run!");
    return FALSE;
    }
         。
    }就可以了
      

  2.   

    这里有例子:
    如何只启动应用程序的一个实例
    http://www.ccw.com.cn/htm/app/aprog/01_11_27_2.asp
      

  3.   

    但是用互斥变量时候,如果要把窗口从最小化复原一样要enum 窗体
      

  4.   

    自定义一个消息
    Registermessage
    在共享段里设置一个变量
    当程序启动时发出自定义消息
    检查变量值如果为1就推出
    如果为0就启动
      

  5.   

    GlobalFindAtom(),GlobalAddAtom()等相关函数,查MSDN