如何实现一个程序只运行一个实例啊?即任务管理器中只有一个进程。急啊

ilovc 2003-07-03 01:54:25
急啊,谢谢!
...全文
81 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilovc 2003-07-03
  • 打赏
  • 举报
回复
搞定,用列举当前所有进程做的。
jvcit 2003-07-03
  • 打赏
  • 举报
回复
study
ilovc 2003-07-03
  • 打赏
  • 举报
回复
谢谢!
但是这样做有一个问题啊,就是在winxp下,在一个用户下运行程序,然后切换用户,在新的用户下这个程序又能运行一个新的实例了啊。我想在切换用户后也能阻止它运行,要用什么办法啊?
wuwind 2003-07-03
  • 打赏
  • 举报
回复
方法很多;下面是一种
在APP的初始化中加:
if(FirsthWnd=FindWindow(NULL,title))
{
FirstChildWnd=GetLastActivePopup(FirsthWnd);
BringWindowToTop(FirsthWnd);
if(FirstChildWnd!=FirsthWnd)
BringWindowToTop(FirstChildWnd);
ShowWindow(FirsthWnd,SW_SHOWNORMAL);
return FALSE;
}
dwangs 2003-07-03
  • 打赏
  • 举报
回复
一个简易的方法是
启动时用CreateMutex()检测是否有另一个实例在工作,如果ERROR_ALREADY_EXISTS就终止
孤必有邻 2003-07-03
  • 打赏
  • 举报
回复
这里有两个函数,在CXXXApp::InitInstance()函数中调用
前者在函数开始处,后者在函数结束处
// 单次运行控制函数
BOOL StartCheck(CWinApp * app)
{
::CreateMutex( NULL, TRUE, app->m_pszExeName );
if( GetLastError() == ERROR_ALREADY_EXISTS )
{
// Set Focus to Previous instance
// First find our previous application's main window.
CWnd * pPrevWnd = CWnd::GetDesktopWindow()->GetWindow(GW_CHILD);
while( pPrevWnd )
{
if( ::GetProp( pPrevWnd->GetSafeHwnd(), app->m_pszExeName ) )
{
// Found window, now set focus to the window.
// First restore window if it is currently iconic.
if( pPrevWnd->IsIconic() )
pPrevWnd->ShowWindow(SW_RESTORE);
// Set focus to main window.
pPrevWnd->SetForegroundWindow();
// If window has a pop-up window, get next window in list.
pPrevWnd->GetLastActivePopup()->SetForegroundWindow();
return FALSE;
}
// Did not find window, get next window in list.
pPrevWnd=pPrevWnd->GetWindow(GW_HWNDNEXT);
}
TRACE("Could not find previous instance main window!\n");
return FALSE;
}
return TRUE;
}
void EndCheck(CWnd*pDlg,CString m_pszExeName)
{
::SetProp( pDlg->GetSafeHwnd(), m_pszExeName, (HANDLE)1 );
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧