我做了个看图程序
在winmain最前面加上下面代码实现only启1个实例
// 用应用程序名创建信号量 
HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName);//"OVLIVE20030703S");  // 信号量已存在? 
// 信号量存在,则程序已有一个实例运行 
if (GetLastError() == ERROR_ALREADY_EXISTS) 

// 关闭信号量句柄 
CloseHandle(hSem); 
// 寻找先前实例的主窗口 
HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD); 
while (::IsWindow(hWndPrevious)) 

// 检查窗口是否有预设的标记? 
// 有,则是我们寻找的主窗 
if (::GetProp(hWndPrevious, m_pszExeName)) 

// 主窗口已最小化,则恢复其大小 
if (::IsIconic(hWndPrevious)) 
::ShowWindow(hWndPrevious,SW_RESTORE); 

// 将主窗激活 
::SetForegroundWindow(hWndPrevious);  // 将主窗的对话框激活 
::SetForegroundWindow( 
::GetLastActivePopup(hWndPrevious));  // 退出本实例 
return FALSE; 

// 继续寻找下一个窗口 
hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT);

// 前一实例已存在,但找不到其主窗 
// 可能出错了 
// 退出本实例 
return FALSE; 
} 代码好用。但是我有个问题:现在如果有1个看图程序在看,再双击bmp关联调用我的程序以后,现在就是把原来那个弹到最前面,但是看得还是老图,怎么让我看到的是最后双击得图片

解决方案 »

  1.   

    找到前一个实例的主窗口以后,应该执行图形处理的那段代码。
    // 检查窗口是否有预设的标记? 
    // 有,则是我们寻找的主窗 
    if (::GetProp(hWndPrevious, m_pszExeName)) 

    // 主窗口已最小化,则恢复其大小 
    // Add you Code Here to Load The new BMP Image
    // 若是对话框的程序
    // 假定对话框类名(CTestDlg),画图成员函数DrawPic(char *fn) 
    ((CTestDlg*)hWndPrevious)->DrawPic(strPicFileName);

    if (::IsIconic(hWndPrevious)) 
    ::ShowWindow(hWndPrevious,SW_RESTORE); 
    // 将主窗激活 
    ((CTest2Dlg*)hWndPrevious)->test();
    ::SetForegroundWindow(hWndPrevious);  // 将主窗的对话框激活 
    ::SetForegroundWindow( 
    ::GetLastActivePopup(hWndPrevious)); 
    // 退出本实例 
    return FALSE; 

    // 继续寻找下一个窗口 
    hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT);

    // 前一实例已存在,但找不到其主窗 
    // 可能出错了 
    // 退出本实例 
    return FALSE;
      

  2.   

    mfc168(闶阆) ( )说得很对