在托管VC中实现程序的唯一实例

passionhip 2008-07-18 11:50:02
RT
就是要保持程序唯一实例,要怎么做?也像搜出来的那些方法吗?还是CLR提供了更简捷的方法?
如果我描述的有问题,请给个思路。
Speed up!
...全文
159 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
foxhill 2008-07-18
  • 打赏
  • 举报
回复
一次只运行一个程序实例,如果已运行则退出
if( FindWindow(NULL,"程序标题")) exit(0);
孤客天涯 2008-07-18
  • 打赏
  • 举报
回复
// 创建互斥体对象
HANDLE hMutex=CreateMutex(NULL, FALSE, "PMSVC 2008 0.0.0.1");
// 如果本程序已有实例在运行,则GetLastError()返回ERROR_ALREADY_EXISTS
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex); //关闭互斥体对象句柄
//获取桌面窗口的一个子窗口。
HWND hWndPrev=::GetWindow(::GetDesktopWindow(),GW_CHILD);
// 枚举当前窗口,查找本程序已运行的实例
while(::IsWindow(hWndPrev))
{
//判断窗口是否有预先设置的属性"MutexDlg",
//如有,则是要本程序已运行实例的窗口,并将它激活。
if(::GetProp(hWndPrev,PROPNAME))
{
//如果主窗口已最小化,则恢复其大小。
if (::IsIconic(hWndPrev))
::ShowWindow(hWndPrev,SW_RESTORE);

//激活应用程序的主窗口
::SetForegroundWindow(hWndPrev);
return FALSE;//退出本实例
}
//继续寻找下一个窗口。
hWndPrev = ::GetWindow(hWndPrev,GW_HWNDNEXT);
}

//AfxMessageBox(theApp.GetStringFromResourceID(IDS_STRING_ALREADY_EXISTS_ERROR),MB_OK|MB_ICONINFORMATION,NULL);
return FALSE; //退出本实例
}
passionhip 2008-07-18
  • 打赏
  • 举报
回复
按劳分配吧,采纳了2楼的方法,3楼的没用上。

15,466

社区成员

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

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