为了避免重复打开程序,所以给了个提示
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);   
sPath.ReleaseBuffer();
HANDLE   m_hMutex   =   CreateMutex(NULL,TRUE,"CZvod.exe");   
if   (GetLastError()==ERROR_ALREADY_EXISTS)
{
    if(IDOK==MessageBox("软件已在运行中!","提示",MB_OK))
    { ::SetForegroundWindow(this->m_hWnd); DWORD dwProcessID = ::GetCurrentProcessId();  //获取当前进程ID号
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID); //根据进程ID返回对象句柄
::TerminateProcess(hProcess,0);  //根据对象句柄结束进程
CloseHandle(hProcess);
    }
}那怎么让他重复运行时弹出第一次运行的窗口?我用::Findwindow()  因为这个窗口的标题是一样,所以获取不到第一次运行的窗口
找到的话可以激活它  ::SetForegroundWindow(hWnd);
讨论题:   怎么实现打开一个文件获取它的进程ID?  

解决方案 »

  1.   

    你可以在app类的初使化中添加代码,这样第二个窗口就没有显示的机会。
      

  2.   


    同上在C***APP类的InitInstance()添加
      

  3.   

    在程序窗口没有创建之前,即APP类的InitInstance()中判断Mutex,
    然后查找窗口FindWindowEx查找第一个程序的窗口,然后ShowWindow、SetForegroundWindow即可。
      

  4.   

    那怎么让他重复运行时弹出第一次运行的窗口?------------------------------------
    #define APP_NAME _T("_MyAppName_")App类中增加成员变量HANDLE hMutex; // 互斥对象
    App类的构造函数初始化hMutext变量,hMutext = NULL;
    App类的InitInstance()
    {
      hMutex = CreateMutex(NULL, FALSE, APP_NAME);
      if((NULL != hMutex) && (ERROR_ALREADY_EXISTS == GetLastError()))
    {
     HWND hWnd = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
    while(::IsWindow(hWnd))
    {
     if(::GetProp(hWnd, APP_NAME))
    {
     if(::IsIconic(hWnd))
    {
     ::ShowWindow(hWnd, SW_RESTORE);
    }
    SetForegroundWindow(hWnd);
    break;
    }
    hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
    }
    }
    return FALSE;
    }
    重载APP类的ExitInstance()虚函数
    {
     if(NULL != hMutex)
    {
     CloseHandle(hMutex);
    hMutex = NULL;
    }
    }在你的对话框类的OnInitDialog()或者SDI/MDI框架类的OnCreate()类加入语句:
    ::SetProp(GetSafeHwnd(), APP_NAME, (HANDLE)0x1);即可