现在我的程序已经实现了鼠标在双击对应的文件类型时调用我的应用程序来打开,但是现在的问题是每每双击对应的文件都要另开一个程序,我要怎样做到如果程序在打开的状态时,直接在已经打开的程序中显示鼠标双击的文件,而不是在另外打开一个程序?这得用到怎样的技术啊,刚刚接触没有什么思路!

解决方案 »

  1.   

    检测到有打开的相同的进程的时候(带名字的mutex或者semaphore都可以),检测之前主窗口,发送消息把文件名发过去,关闭。
    原来的那个收到消息后打开相应的文件.............
      

  2.   

    就是象explore一样,不太好搞。
      

  3.   

    我原来做个一个类似的,你可以试试//(1)注册消息
    #define UNIQUEAPP                     _T("UNIQUEAPP")
    static const UINT UWM_UNIQUEAPP       = ::RegisterWindowMessage(UNIQUEAPP);

    //(2)在CMainFrame中处理UWM_UNIQUEAPP消息
    //.h
    afx_msg LRESULT OnUniqueApp(WPARAM wParam, LPARAM lParam);
    //.cpp
    ON_REGISTERED_MESSAGE(UWM_UNIQUEAPP, OnUniqueApp)

    LRESULT CMainFrame::OnUniqueApp(WPARAM wParam, LPARAM lParam)
    {
    return UWM_UNIQUEAPP;
    }//(3)只运行一个实例,并找到已存在的实例
    BOOL CXXXApp::InitInstance()
    {  
    //......

    BOOL bExist = FALSE;
    HANDLE hMutex = CreateMutex(NULL, FALSE, UNIQUEAPP);
    bExist = ( ::GetLastError() == ERROR_ALREADY_EXISTS || 
    ::GetLastError() == ERROR_ACCESS_DENIED);
    if (bExist)
    {
    HWND hOther = NULL;
    EnumWindows(SearchExist, (LPARAM)&hOther);
    if ( hOther != NULL )
    {
    ::SetForegroundWindow(hOther);
    if (IsIconic(hOther))
    ::ShowWindow(hOther, SW_RESTORE);
    if (IsWindowVisible(hOther) == FALSE)
    ::ShowWindow(hOther, SW_SHOW); CString strFile = m_lpCmdLine;
    if (!strFile.IsEmpty())
    {
    //使用WM_COPYDATA向已存在的实例发送要打开的文件
    DWORD dwResult;
    strFile.Remove('\"');
    COPYDATASTRUCT cpds;
    cpds.cbData = strFile.GetLength()*sizeof(TCHAR);
    cpds.lpData = strFile.GetBuffer(0);
    cpds.dwData = reinterpret_cast<DWORD>(UNIQUEAPP);
    ::SendMessageTimeout(hOther,
    WM_COPYDATA, 0, (LPARAM)&cpds, 
    SMTO_BLOCK|SMTO_ABORTIFHUNG,
    200,
    &dwResult);
    }

    return FALSE;
    }  //......
    }BOOL CALLBACK CXXXApp::SearchExist(HWND hWnd, LPARAM lParam)
    {
        DWORD dwResult;
        LRESULT lResult = ::SendMessageTimeout(hWnd,
    UWM_UNIQUEAPP,
    0, 0, 
    SMTO_BLOCK|SMTO_ABORTIFHUNG,
    200,
    &dwResult);
        if(lResult == 0)
    return TRUE; // ignore this and continue
        if(dwResult == UWM_UNIQUEAPP)
        {
    /*找到之前运行的实例*/
            HWND* target = (HWND*)lParam;
            *target = hWnd;
            return FALSE;
        }
        return TRUE;
    }//(4)已存在的实例处理WM_COPYDATA消息
    BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
    {
    if (pCopyDataStruct != NULL)
    {
    if (lstrcmpi(UNIQUEAPP, reinterpret_cast<LPCTSTR>(pCopyDataStruct->dwData)) == 0)
    {
    TCHAR szFile[MAX_PATH+1] = {0};
    int nLen = (pCopyDataStruct->cbData > MAX_PATH)?MAX_PATH:pCopyDataStruct->cbData;
    ::CopyMemory(szFile, pCopyDataStruct->lpData, nLen);
    TRACE(_T("通过COPYDATA得到的文件路径名%s"), szFile);
    if (lstrlen(szFile) > 0)
    {
    //打开文件
    }
    }
    }

    return CFrameWnd::OnCopyData(pWnd, pCopyDataStruct);
    }