您的位置:首页 > 其它

程序运行一个实例

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);
......}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: