程序运行一个实例
2010-03-30 19:49
246 查看
程序运行一个实例有多种实现方式,下面的例子使用信号量来完成只运行一个实例的功能1) BOOL CDataMngApp::InitInstance(){ // 使程序只运行一个实例 // 用应用程序名创建信号量 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; } ... ...}
2) int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
//设置寻找标记 ljs ::SetProp(m_hWnd, AfxGetApp()->m_pszExeName,(HANDLE)1);
... ...}
3) void CMainFrame::OnClose(){ ... ...
//删除寻找标记 ::RemoveProp(m_hWnd, AfxGetApp()->m_pszExeName);
......}
2) int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
//设置寻找标记 ljs ::SetProp(m_hWnd, AfxGetApp()->m_pszExeName,(HANDLE)1);
... ...}
3) void CMainFrame::OnClose(){ ... ...
//删除寻找标记 ::RemoveProp(m_hWnd, AfxGetApp()->m_pszExeName);
......}
相关文章推荐
- 让程序只运行一个实例的四种方法(转)
- 【转】C# WinForm 程序单实例运行,再次运行时激活前一个实例
- 在VC++中实现让程序只运行一个实例的方法
- C#程序只允许运行一个实例的解决方案
- VC程序只运行一个实例,并在打开多个时激活原窗口
- Delphi----怎样保证程序只运行一个实例
- 进程地址空间的共享(可以实现一个程序只有一个实例运行)
- delphi程序只允许运行一个实例的简单方法:
- 【转】delphi程序只允许运行一个实例的三种方法:
- qt编写一个只能运行单个实例的程序,不用Windows API
- 使程序只能运行一个实例
- C#利用Mutex实现只运行一个程序实例
- VC++实现程序只运行一个实例 (转)
- 运行一个实例的程序(互斥程序)
- 程序只运行一个实例,并激活已运行的程序
- 仅运行一个程序的单个实例
- delphi程序只允许运行一个实例的三种方法:(转)
- WinForm程序,保证只有一个实例在运行(网上搜集的东西)
- 让程序只运行一个实例
- C# 程序只能运行一次(多次运行只能打开同一个程序) 并激活第一个实例,使其获得焦点,并在最前端显示.