请教:怎样让一个应用程序只能运行一个,当你运行第二个是应用程序自动激活前一个,急急急!!谢谢! 在程序进入的时候也就是InitInstance中创建一个Mutex(互斥体),记得传入互斥体的名字,也就是调用CreateMutex,然后调用GetLastError,看看结果是不是ERROR_ALREADY_EXISTS,如果是的化结束程序(让InitInstance返回FALSE) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if findwindow bringwindowtotop return falseelse ... CreateMutex(...),CreateEvent(...)用这两个函数,很容易实现的. 以下代码供你参考:1、检查应用程序的其他实例是否启动:BOOL CTestApp::InitInstance(){ //... ::CreateMutex(NULL,TRUE,m_pszExeName);if(GetLastError()==ERROR_ALREADY_EXISTS){//TODO:set focus to previous instancereturn FALSE;}2、实现寻找先前实例的代码BOOL CTestAPP::InitInstance(){...::CreateMutex(NULL,TRUE,m_pszExeName);if(GetLastError()==ERROR_ALREADY_EXISTS){ CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHLD); while(pPrevWnd) { if(::GetProp(pPrevWnd->GetSafeHWnd(),m_pszExeNAme)) { if(pPrevWnd->IsIconic()) pPrevWnd->ShowWindow(SW_RESTORE); pPrevWnd->SetForegroundWindow(); pPrevWnd->GetLastActivePopup()->SetForegroundWindow(); return FALSE; } pPrevWnd = pPrevWnd->GetWindow(GW_HWNDNEXT); } return FALSE:}...pMainFrame->UpdateWindow();::SetProp(pMainFrame->GetSafeHwnd(),m_pszExeName,(HANDLE)1);return TRUE;}3 删除先前的标示符 加进以下内容: void CMainFrame::OnDestory(){ ::RemoveProp(GetSafeHwnd(),AfxGetApp()->m_pszExeName); CMDIFrameWnd::OnDestory();}这样做一定是可行的,我已经试过了。仅供参考程序代码来源于 Visual C++ 4 开发人员指南 sorry:CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHLD);更正CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHLD); CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHILD); 看这段代码:HANDLE hObject = CreateMutex(NULL,FALSE,"zhangmin"); if(GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hObject); AfxMessageBox("程序已经运行!"); return FALSE; } 下面代码没有调试,是刚写的,你去试看看:在InitInstance中:m_hMutex = ::CreateMutex(NULL,FALSE,"_name_you_define_");if( !m_hMutex ) return FALSE;if( ::WaitForSingleObject( m_hMutex, 0 ) == WAIT_TIMEOUT ) return FALSE;return TRUE;在ExitInstance中:ReleaseMutex( m_hMutex ); CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHILD);是什么意思?请赐教!!!谢谢!! CWnd::GetDesktopWindow().GetWindow( GW_CHILD );// 获取桌面窗口的子窗口 http://www.csdn.net/develop/read_article.asp?id=10548 可以用FindWindow()来查看当前有没有指定的标题窗口,有就用AcitveWindow并CloseWindow当前窗口,没有就新增一个Create 1.在.h中声明一个private型变量: HANDLE m_hMutex;2.在InitInstance()的开始加上: CString strClassName="myproject";//用来识别是否已经运行的字符串 m_hMutex=OpenMutex(MUTEXT_ALL_ACCESS,false,strClassName); if(m_hMutex==NULL) //不存在,则创建并继续运行程序 m_hMutex=CreateMutex(NULL,true,strClassName); else return false; //停止运行3.在ExitInstance中,一定记住要把这个变量给销毁,否则,你不能再打开他了: if(m_hMutex!-NULL) ReleaseMutex(m_hMutex); pMainFrame->UpdateWindow();中的pMainFrame没有定义,该怎么定义! 求MFC调用matlab函数的库文件! 帮看一下哪里有问题! [转贴] 韩国迁都,青屁股理论导致进化论破产,世界即将大同 V请指导: C用ADO做一个DLL的问题(附代码) ----急!!! 如何新建一个文件夹 小问题,大虾帮忙,谢先。 怎么使一个程序中的某几个对话框的大小一致? 100分--关于多语种的问题 vc++ ADO操作数据库 打开记录集出现 Unknown error 0x800A0E7D,如何解决 如何控制多块视频捕获卡进行显示与抓拍? [ ... ]和< .. >中的语句是什么意思啊? 怎样连接Internet上的主机????
bringwindowtotop
return false
else
...
用这两个函数,很容易实现的.
1、检查应用程序的其他实例是否启动:
BOOL CTestApp::InitInstance()
{
//...
::CreateMutex(NULL,TRUE,m_pszExeName);
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
//TODO:set focus to previous instance
return FALSE;
}
2、实现寻找先前实例的代码
BOOL CTestAPP::InitInstance()
{
...
::CreateMutex(NULL,TRUE,m_pszExeName);
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHLD);
while(pPrevWnd)
{
if(::GetProp(pPrevWnd->GetSafeHWnd(),m_pszExeNAme))
{
if(pPrevWnd->IsIconic())
pPrevWnd->ShowWindow(SW_RESTORE);
pPrevWnd->SetForegroundWindow();
pPrevWnd->GetLastActivePopup()->SetForegroundWindow();
return FALSE;
}
pPrevWnd = pPrevWnd->GetWindow(GW_HWNDNEXT);
}
return FALSE:
}
...
pMainFrame->UpdateWindow();
::SetProp(pMainFrame->GetSafeHwnd(),m_pszExeName,(HANDLE)1);return TRUE;
}
3 删除先前的标示符 加进以下内容:
void CMainFrame::OnDestory()
{
::RemoveProp(GetSafeHwnd(),AfxGetApp()->m_pszExeName);
CMDIFrameWnd::OnDestory();
}
这样做一定是可行的,我已经试过了。
仅供参考程序代码来源于
Visual C++ 4 开发人员指南
CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHLD);更正
CWnd *pPrevWnd = CWnd::GetDesktopWindow() GetWindow(GW_CHLD);
HANDLE hObject = CreateMutex(NULL,FALSE,"zhangmin");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hObject);
AfxMessageBox("程序已经运行!");
return FALSE;
}
m_hMutex = ::CreateMutex(NULL,FALSE,"_name_you_define_");
if( !m_hMutex )
return FALSE;
if( ::WaitForSingleObject( m_hMutex, 0 ) == WAIT_TIMEOUT )
return FALSE;
return TRUE;在ExitInstance中:
ReleaseMutex( m_hMutex );
// 获取桌面窗口的子窗口
并CloseWindow当前窗口,没有就新增一个Create
HANDLE m_hMutex;
2.在InitInstance()的开始加上:
CString strClassName="myproject";//用来识别是否已经运行的字符串
m_hMutex=OpenMutex(MUTEXT_ALL_ACCESS,false,strClassName);
if(m_hMutex==NULL) //不存在,则创建并继续运行程序
m_hMutex=CreateMutex(NULL,true,strClassName);
else
return false; //停止运行
3.在ExitInstance中,一定记住要把这个变量给销毁,否则,你不能再打开他了:
if(m_hMutex!-NULL)
ReleaseMutex(m_hMutex);