难题,,多谢大家。。看看 如何防止程序多个实例运行也就是说,一个程序正在运行,那么我再点击该程序图标时,程序不再打开一个新的改程序进程。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、在App类的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、在CMainFrame类的OnCreate(LPCREATESTRUCT lpCreateStruct)函数的return -1后面增加语句: ::SetProp(m_hWnd, theApp.m_pszExeName, (HANDLE)1);//做已启动标记;3、在CMainFrame类的OnDestroy()函数中增加语句: ::RemoveProp(m_hWnd, theApp.m_pszExeName); //删除已启动表记;就可以了 方法很多,常用的是: 程序开始创建一个有名事件. 如果返回已经存在,则退出,否则会创建成功.这是第一个实例. 这个事件保存下来,程序结束前CLOSE掉.其后运行的实例再次创建该同名的事件都会返回已经存在.HANDLE g_hEvent = NULL;BOOL CMyApp::InitInstance(){ g_hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "MyEventName<<<><随便起的名字>>>><<><>"); if (g_hEvent) { CloseHandle(g_hEvent); return FALSE; } // ................ // 其它代码}void CMyApp::ExitInstance(){ CloseHadle(g_hEvent); CWinApp::ExitInstance();} 漏了一句: 执行其它代码前创建该事件 g_hEvent = ::CreateEvent(0, TRUE, FALSE, "MyEventName<<<><随便起的名字>>>><<><>"); 这样更好点,不用先打开,直接创建:g_hEvent = ::CreateEvent(0, TRUE, FALSE, "MyEventName<<<><随便起的名字>>>><<><>");if(GetLastError() == ERROR_ALREADY_EXISTS){ // 已经存在的事件 CloseHandle(g_hEvent); return FALSE;} // 做其它 libcurl重用TCP连接的问题 用了xp风格文件manifest后关闭窗口怎么会出错? 请教:我知道按钮ID,怎样给它发消息? 如果我要记录全屏幕的像素颜色,是不是要这样做? 请教opengl线框模型和实体模型的显示问题? 如何在对话框的group box控件中加入另一个对话框? BYTE* 类型与 VARIANT 类型转换的问题 winapi是个什么啊? 为什么编译报error C2259? 从ini文件中获得一个section的全部键名及值名的问题 MSDN出问题了,谁解决了给100分(用我的信誉担保),同情者给2分! 高手帮忙看看 这个连接错误哪里错了 ?
// 用应用程序名创建信号量
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、在CMainFrame类的OnCreate(LPCREATESTRUCT lpCreateStruct)函数的return -1后面增加语句:
::SetProp(m_hWnd, theApp.m_pszExeName, (HANDLE)1);//做已启动标记;3、在CMainFrame类的OnDestroy()函数中增加语句:
::RemoveProp(m_hWnd, theApp.m_pszExeName); //删除已启动表记;就可以了
其后运行的实例再次创建该同名的事件都会返回已经存在.HANDLE g_hEvent = NULL;
BOOL CMyApp::InitInstance()
{
g_hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "MyEventName<<<><随便起的名字>>>><<><>");
if (g_hEvent)
{
CloseHandle(g_hEvent);
return FALSE;
} // ................
// 其它代码}
void CMyApp::ExitInstance()
{
CloseHadle(g_hEvent);
CWinApp::ExitInstance();
}
g_hEvent = ::CreateEvent(0, TRUE, FALSE, "MyEventName<<<><随便起的名字>>>><<><>");
// 已经存在的事件
CloseHandle(g_hEvent);
return FALSE;
}
// 做其它