在yourApp::InitInstance()中创建一个Mutex。首次运行时会成功,以后再运行就会失败,然后退出程序。
解决方案 »
- 关于timeSetEvent失败
- 求开源浏览器,最好是WINCE下的
- 录音并实时播放程序主要代码如下,但是有错误导致无法发出声音,请高手帮帮忙!!!
- WTL如何<高效>的拉伸贴位图的不规则窗体?
- 新手继续问弱问题...如何设置从资源载入BMP的长和宽=.=...
- 如何控制打印图片的大小
- 焦点的问题!
- error C2039: 'CoCreateInstanceEx' : is not a member of '`global namespace''
- 用 DrawImage 画 png 图很慢,有没有其他更好的方法
- 何处寻找 tlb 文件及其描述文档?
- 怎么在关闭一个SDI程序的时候进行提示?
- 谁能告诉我COMMAND与UPDATE_COMMAND_UI的区别,谢谢!
CreateMutex(NULL,TRUE,"我的应用程序代号");
if(ERROR_ALREADY_EXISTS==GetLastError())
{
// 已经运行了一个进程
}
{
CreateMutex(NULL,TRUE,AfxGetAppName());
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBox("程序已经运行"); //或不写
return FALSE;
}
....
}方案一: 查找窗口类
方案二: 设置窗口属性
方案三: 使用文件映像
方案四: 使用原子
方案五: 使用同步对象
方案一: 使用注册类查找的方法实现单实例运行
例:
①C???App::InitInstance
BOOL C???App::InitInstance()
{
if (!FirstInstance())
return FALSE;
beRegisted=TRUE;
m_pMainWnd =new CMainWnd();
m_pMainWnd->CreateEx(0,"fmdmainwnd",
_T("CodeHelper"),WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,NULL);
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
其中beRegisted为C???App成员
public:
BOOL beRegisted;
②C???App::FirstInstance
BOOL CMainApp::FirstInstance()
{
CWnd *PrevCWnd, *ChildCWnd;
if (PrevCWnd = CWnd::FindWindow("fmdmainwnd",NULL))
{
ChildCWnd=PrevCWnd->GetLastActivePopup();
PrevCWnd->BringWindowToTop();
if (PrevCWnd->IsIconic())
PrevCWnd->ShowWindow(SW_RESTORE);
if (PrevCWnd != ChildCWnd)
ChildCWnd->BringWindowToTop();
return FALSE;
}
else
return TRUE; // First instance. Proceed as normal.
}
③C???App::InitApplication
BOOL CMainApp::InitApplication()
{
CWinApp::InitApplication();
WNDCLASS wndcls;
//注册自定义类
memset(&wndcls, 0, sizeof(WNDCLASS));
//窗口基本类型
wndcls.style=CS_DBLCLKS ¦ CS_HREDRAW ¦ CS_VREDRAW;
wndcls.lpfnWndProc=::DefWindowProc;
wndcls.hInstance=AfxGetInstanceHandle();
wndcls.hIcon=LoadIcon(IDR_MAIN);
wndcls.hCursor=LoadStandardCursor(IDC_ARROW);
wndcls.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wndcls.lpszMenuName=MAKEINTRESOURCE(IDR_MAIN);
wndcls.lpszClassName="fmdmainwnd";
return AfxRegisterClass(&wndcls);
}
④C???App::ExitInstance
int CMainApp::ExitInstance()
{
if(beRegisted)
::UnregisterClass("fmdmainwnd", AfxGetInstanceHandle());
return CWinApp::ExitInstance();
}方案二:设置窗口附加属性 int C???Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
::SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)1);
......
}
void C???Dlg::OnDestroy()
{
......
::RemoveProp(m_hWnd, AfxGetApp()->m_pszExeName);
......
}
BOOL CEllipseWndApp::InitInstance()
{
// Create a Semaphore with a name of application exename
HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName);
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hSem);
HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
while (::IsWindow(hWndPrevious))
{
if (::GetProp(hWndPrevious, m_pszExeName))
{
if (::IsIconic(hWndPrevious))
::ShowWindow(hWndPrevious, SW_RESTORE);
::SetForegroundWindow(hWndPrevious);
::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
return FALSE;
}
hWndPrevious = ::GetWindow(hWndPrevious, GW_HWNDNEXT);
}
return FALSE;
}
C????Dlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
}
return FALSE;
}方案三:使用文件映像
另文有述方案四:使用原子
BOOL C???App::InitInstance()
{
.....
if(GlobalFindAtom("AdBreaker")) //找原子
return false;
ATOM GlobalAtom=GlobalAddAtom("AdBreaker"); //添加原子
CAdBreakerDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
.....
GlobalDeleteAtom(GlobalAtom);
return FALSE;
}方案五:使用同步对象 InitInstance中
HANDLE m_hMutex =
CreateMutex(NULL,TRUE,m_pszAppName);
if (GetLastError()==ERROR_ALREADY_EXISTS){
return FALSE;
}另:在
http://www.csdn.net/expert/topic/159/159112.shtm
中liuqiannan(二迷糊) 的方案也不错:回复人:liuqiannan(二迷糊) (2001-6-14 22:28:00) 得0分
用一个共享数据段,定义一个用来计数的长整形
#pragma data_seg(".OnlyOne")
long 1Count=-1;
#pragma data_seg()用DEF文件定义共享属性
SECTIONS
.OnlyOne READ WRITE SHARED在初始化阶段,如InitInstance开始处,加入
BOOL bFirstInit=(InterlockedIncrement($1InstanceCount)==0)
if(!bFirstInit)
{
AfxMessageBox("该程序已经运行",MB_OK¦MB_ICONSTOP);
InterlockedDecrement($1InstanceCount);
return FALSE;
}
程序结束后,调用:
InterlockedDecrement(&1InstanceCount);