[求教]如何使应用程序在同一时刻只有一个实例在运行?
就像Media Player一样? 问题点数:50、回复次数:8Top
1 楼zzkcn()回复于 2003-09-04 08:12:22 得分 10
在App类InitInstance()函数的开头增加:
CWnd *pOtherWnd = CWnd::FindWindow(NULL, "A2");//A2是主框架的标题
if(pOtherWnd!=NULL)
{
AfxMessageBox("Program already running!");
return FALSE;
}Top
2 楼abc_rain()回复于 2003-09-04 08:12:36 得分 10
_hMutex=CreateMutex(NULL,FALSE,m_pAppName); //HANDLE m_hMutex;
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
HWND hWnd=::FindWindow(NULL,m_pAppName);
if(hWnd)
{
if(::IsIconic(hWnd))
::ShowWindow(hWnd,SW_RESTORE);
::SetForegroundWindow(hWnd);
::SetForegroundWindow(::GetLastActivePopup(hWnd));
}
else
MessageBox(NULL,"您的程序已经运行了","提示信息",MB_ICONINFORMATION);
return FALSE;
}
//在 InitInstance 中,创建信号量:
HANDLE hSem = CreateSemaphore(NULL,1,1,m_pszAppName);
//信号量已存在?
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
//关闭信号量句柄
CloseHandle(hSem);
//寻找先前实例的主窗口
HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD);
while(::IsWindow(hWndPrevious))
{
//检查窗口是否有预设的标记?
//有,则是我们寻找的主窗口
if(::GetProp(hWndPrevious,m_pszAppName))
{
//主窗口已经最小化,则恢复其大小
if(::IsIconic(hWndPrevious))
::ShowWindow(hWndPrevious,SW_RESTORE);
//将主窗口激活
::SetForegroundWindow(hWndPrevious);
//将主窗口对话框激活
::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
//退出本实例
reture FALSE;
}
else
//继续寻找下一个窗口
hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT);
}
//前一实例已存在,但找不到其主窗口
//可能出错了
//退出本实例
return FALSE;
}
Top
3 楼cadinfo(无语清风)回复于 2003-09-04 08:12:41 得分 10
1.使用Mutex互斥变量
2.使用Prop参加API函数SetProp就懂了Top
4 楼rivershan(阿门)回复于 2003-09-04 10:35:30 得分 10
用Mutex就ok了~
一个程序只能拥用一个Mutex~Top
5 楼clrscr(明净止水)回复于 2003-09-04 17:56:33 得分 0
那么我如何得到已经在运行实例中的数据呢?
比如,已经运行了一个Pro.exe,其中有一个int,我运行第二个Pro.exe时,希望第二个Pro.exe在检测到已经有一个实例在运行以后,把那个实例中的int加一,然后第二个实例结束。
再不用外部文件的前提下,能不能作到。
谢谢。Top
6 楼ifengfeng(fengfeng)回复于 2003-09-05 14:31:02 得分 0
InitInstance()里:
HANDLE m_hMutex = CreateMutex(NULL,TRUE, m_pszAppName);
if(GetLastError() == ERROR_ALREADY_EXISTS) { return FALSE; }Top
7 楼ifengfeng(fengfeng)回复于 2003-09-05 14:31:26 得分 10
InitInstance()里:
HANDLE m_hMutex = CreateMutex(NULL,TRUE, m_pszAppName);
if(GetLastError() == ERROR_ALREADY_EXISTS) { return FALSE; }Top
8 楼DarkShow(我是一个神话)回复于 2003-09-05 14:36:11 得分 0
其实可以做个共享dll,里面放一个变量,启动一次就+1,关闭就-1
你就可以限制你开几个实例了。
我这个方法是偏门,楼上几位大大得才是正道哟。Top
9 楼mainmaster(云中漫步)回复于 2003-09-05 14:59:31 得分 0
不明白你的第2个问题,你是要实现记录冲突的启动次数还是?Top



