问题是这样的,我们的程序只能有一个实例在系统运行,当在文件浏览器中双击一个文件时(当然是我们的程序能打开的类型啦),如果发现已经有一个实例在运行,就通知前一个实例打开这个文件,新运行的实例退出:
//前面的代码略
if(cmdInfo.m_nShellCommand==CCommandLineInfo::FileOpen || 
cmdInfo.m_nShellCommand == CCommandLineInfo::FilePrintTo ||
cmdInfo.m_nShellCommand == CCommandLineInfo::FilePrint)
{
COPYDATASTRUCT cds;
memset(&cds, 0, sizeof(COPYDATASTRUCT));
cds.cbData = sizeof(structAppNotifyOpenFileType);
structAppNotifyOpenFileType anof;
anof.type = cmdInfo.m_nShellCommand;
_tcscpy(anof.file, cmdInfo.m_strFileName.GetBuffer(0));
cds.lpData = &anof;
SendMessage(pPrevWnd->m_hWnd, WM_COPYDATA, NULL, (LPARAM)&cds);
}
else
{
AfxMessageBox(IDS_STRING_Create_Err,MB_ICONWARNING,0);//取不能重入提示
}
if(pPrevWnd->IsIconic()) // 查找该窗口,如果它已最小化,则将它还原
pPrevWnd->ShowWindow(SW_RESTORE);
pPrevWnd->SetForegroundWindow(); // 使窗口获得焦点
pPrevWnd->GetLastActivePopup()->SetForegroundWindow();// 如果该窗口有弹出窗口,则首先将弹出窗口调用前台

ExitInstance(); //?
return FALSE;
//后面的代码略
当是打开文件的时候,我们的程序的主窗口能很好的变成最顶层的窗口;
由于这样调用:
EnableShellOpen();
RegisterShellFileTypes(TRUE);
并且我重载了CWinApp::ProcessShellCommand,将其中打印时发送ID_FILE_PRINT_DIRECT消息改成发送ID_FILE_PRINT消息,这样,我期望当在文件浏览器右击一个文件,在弹出菜单中选"打印"时,前一个实例能打这个文件,并弹出"打印"对话框.
但是,问题是,这个时候并不能像打开文件时那样主窗口变成桌面的顶层窗口,当在任务栏上单击相关的图标才能显示出窗口,这个时候会发现它的确打开了我想要打开的文件,并弹出了"打印"对话框!
请问,这个时候怎么做才能使程序的主窗口自动变成顶层窗口!

解决方案 »

  1.   

    HWND hwndOBJ=FindWindow(NULL,"xxx");//获得窗口句柄
    SetForegroundWindow(hwndOBJ);//找到句柄后将其设置为当前窗口
      

  2.   

    ouyh12345(五岭散人):我问的不是这个,这个东西我知道.麻烦请仔细看看!谢谢!
      

  3.   

    把:
    if(pPrevWnd->IsIconic())// 查找该窗口,如果它已最小化,则将它还原
    pPrevWnd->ShowWindow(SW_RESTORE);
    pPrevWnd->SetForegroundWindow();// 使窗口获得焦点
    pPrevWnd->GetLastActivePopup()->SetForegroundWindow();// 如果该窗口有弹出窗口,则首先将弹出窗口调用前台
    提前到发送WM_COPYDATA消息的那块语句前!
      

  4.   

    不明白,是放到前面不行吗?
    按你的意思:
      试试pPrevWnd->ShowWindow(SW_SHOWNORMAL);
      

  5.   

    我刚做过单实例的程序,和你有类似功能,第2个instance查找有没有第1个,有就退出,让第1个TOP现实,你看看是否和你一样http://image.fotoever.com/ImageServer/download/FESetup.exe
    如果满足的话,我给你发点代码