BOOL bFound = FALSE;// Try to create a mutex with the app's name
HANDLE hMutexOneInstance = ::CreateMutex(NULL,TRUE,_T(AfxGetAppName()));// Already there...means that we are already running an instance
if(::GetLastError() == ERROR_ALREADY_EXISTS)
bFound = TRUE;// Release the mutex
if(hMutexOneInstance)
::ReleaseMutex(hMutexOneInstance);
HANDLE hMutexOneInstance = ::CreateMutex(NULL,TRUE,_T(AfxGetAppName()));// Already there...means that we are already running an instance
if(::GetLastError() == ERROR_ALREADY_EXISTS)
bFound = TRUE;// Release the mutex
if(hMutexOneInstance)
::ReleaseMutex(hMutexOneInstance);
解决方案 »
- 好久没有进来了,发个帖散散分,天冷,大家挤进来凑凑热闹哈
- 十进制如何转换为十六进制,不用显示,是不是有什么函数?
- Cstring 在多字符集下会出错
- @@高手去那里了,如何截取局部屏幕保存@@
- 求解析文本中URL及Email的C代码。
- 搞了半年PB,实在没兴趣,辞职找C++了--各位老大请指点
- 创建的月历控件怎么没有显示出来?
- 不懂
- 请教:Vista下OpenSCManager返回为0的问题
- 怎么获取一个CView对象的rect
- 我是socket api的初学者,用api怎样实现像mfc中csocket类的onaccept,onrecive事件,最好有详细的源码,很急得,希望得到高手们的帮助
- 看图有分!
......
共享内存中,再次启动实例时可以从中取出HWND(不用遍历查找窗口了),发送一些自定义的消息。例如支持命令行参数:
myapp /exit (如果没有实例,则什么也不做,否则让活动的实例退出)
myapp /restart(如果没有实例,则启动一个,否则让活动的实例重启动)
{
CWnd *pPrevWnd = CWnd::GetDesktopWindow();
pPrevWnd = pPrevWnd->GetWindow(GW_CHILD);
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);
}
TRACE("Could not find previous instance main window! \n");
return FALSE;
}
把这段代码加入app类的InitInstance()函数的::CreateMutex(NULL,TRUE,m_pszExeName);后面就行了
#pragma data_seg("MyTest")
Long g_lUsageCount=-1;
#pragma data_seg
#pragma comment(linker,"-section:MyTest,rws")
然后,在InitInstance()中增加:
CXXXApp::InitInstance()
{
// 增加
if((g_lUsageCount>=0) {
AfxMessageBox("应用程序已经运行了");
exit(0);
}
InterLockedIncrement(&g_lUsageCount);
// Over
........
}
试一试吧。