问题是这样的,我们的程序只能有一个实例在系统运行,当在文件浏览器中双击一个文件时(当然是我们的程序能打开的类型啦),如果发现已经有一个实例在运行,就通知前一个实例打开这个文件,新运行的实例退出:
//前面的代码略
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消息,这样,我期望当在文件浏览器右击一个文件,在弹出菜单中选"打印"时,前一个实例能打这个文件,并弹出"打印"对话框.
但是,问题是,这个时候并不能像打开文件时那样主窗口变成桌面的顶层窗口,当在任务栏上单击相关的图标才能显示出窗口,这个时候会发现它的确打开了我想要打开的文件,并弹出了"打印"对话框!
请问,这个时候怎么做才能使程序的主窗口自动变成顶层窗口!
//前面的代码略
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消息,这样,我期望当在文件浏览器右击一个文件,在弹出菜单中选"打印"时,前一个实例能打这个文件,并弹出"打印"对话框.
但是,问题是,这个时候并不能像打开文件时那样主窗口变成桌面的顶层窗口,当在任务栏上单击相关的图标才能显示出窗口,这个时候会发现它的确打开了我想要打开的文件,并弹出了"打印"对话框!
请问,这个时候怎么做才能使程序的主窗口自动变成顶层窗口!
SetForegroundWindow(hwndOBJ);//找到句柄后将其设置为当前窗口
if(pPrevWnd->IsIconic())// 查找该窗口,如果它已最小化,则将它还原
pPrevWnd->ShowWindow(SW_RESTORE);
pPrevWnd->SetForegroundWindow();// 使窗口获得焦点
pPrevWnd->GetLastActivePopup()->SetForegroundWindow();// 如果该窗口有弹出窗口,则首先将弹出窗口调用前台
提前到发送WM_COPYDATA消息的那块语句前!
按你的意思:
试试pPrevWnd->ShowWindow(SW_SHOWNORMAL);
如果满足的话,我给你发点代码