我做了一个图像处理的软件,想用其处理jpg图像。现在对于jpg图像,点击右键选择打开(指定为我的程序),第一次可以打开,第二次的时候就没有反应了。因为我设置了只运行一个程序实例,当第二次用右键打开图像时,会把已经运行的我的程序激活到前台。但现在的问题是第二次用右键打开图像时,我的程序只是被激活到前台并不打开图像(不知道如果解决)。请大家帮忙想个办法,先谢谢啦。BOOL CPGImageApp::InitInstance()
{
const  TCHAR *strMutexName = _T("PGImage");   
//使用“互斥”(Mutex)的方法来保证程序只有一个运行实例   
HANDLE hMutex = CreateMutex(NULL, true, strMutexName);   
if(ERROR_ALREADY_EXISTS == GetLastError() || NULL == hMutex)   
{   
//当已存在一个实例后,将第一个实例在前端显示   
HWND   hWnd = FindWindow(NULL, strMutexName);   
if (NULL != hWnd)   
{   
PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);   
SetForegroundWindow(hWnd);
//应该显示新的图像
}   
return   FALSE;   
}
        .......
}
上面这段代码是用来保证只运行一个实例的,现在只能激活我已经运行的程序,但不执行文档类的打开操作,郁闷。

解决方案 »

  1.   

    我用的是单文档程序,切割了几个窗口。在文档类CPGImageDoc::OnOpenDocument(LPCTSTR lpszPathName)写的打开程序代码。好像激活以后并不执行打开文档的操作。 
      

  2.   


    BOOL CPGImageApp::InitInstance()
    {
        const  TCHAR *strMutexName = _T("PGImage");   
        //使用“互斥”(Mutex)的方法来保证程序只有一个运行实例   
        HANDLE hMutex = CreateMutex(NULL, true, strMutexName);   
        if(ERROR_ALREADY_EXISTS == GetLastError() || NULL == hMutex)   
        {   
            //当已存在一个实例后,将第一个实例在前端显示   
            HWND   hWnd = FindWindow(NULL, strMutexName);   
            if (NULL != hWnd)   
            {   
                PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);   
                SetForegroundWindow(hWnd);
                //应该显示新的图像
                  SendMessage(hWnd,WM_YOUMESSAGE,.....)//发送一个自定义消息,把文件路径传过去
                                                            //让另外一个实例打开文件
            }   
            return   FALSE;   
        }
            .......
    }
      

  3.   

    需要向已经存在的实例(就是已经打开的程序)发送消息,告知要进行“open”动作,打开一个新的图片,在消息中还要传送新图片的路径。
      

  4.   

    对。可以用WM_COPYDATA消息来传。如果用自定义消息,需要用VirtualAllocEx在目标进程中分配内存,用WriteProcessMemory复制数据。
      

  5.   

    对,进程间传自定义消息不能使用指针。如果想用消息传递的话你可以使用WM_COPYDATA来传文件名;不然就同时发过去你的进程ID和文件名字符串指针,让对方读你的进程内存。再不然就用共享内存或管道之类的东东吧。
      

  6.   

    最终采用了cnzdgs提出的WM_COPYDATA方法,现在问题基本解决了,谢谢大家的支持。
    学习了不少东西,再次谢谢大家。