MFC 如何检测进程已启动
我写了一个多文档程序,希望可以只打开一个实例,采用了FindWindow();来解决,但是当打开一个文档时,窗口的名字就变成了MyTest-NewWindow这样就没有办...
我写了一个多文档程序,希望可以只打开一个实例,采用了FindWindow();来解决,但是当打开一个文档时,窗口的名字就变成了MyTest-NewWindow
这样就没有办法检测了。高人帮帮忙。
能不能获得当前执行的进程,并将其最大化呀。
三楼的老大,这个不管用呀,我看了半天代码,也搞不明白,而且启动程序后,最小化,然后再启动这个程序,已经启动的依然是最小化,没有反应。只是不能打开第二个实例而已。 展开
这样就没有办法检测了。高人帮帮忙。
能不能获得当前执行的进程,并将其最大化呀。
三楼的老大,这个不管用呀,我看了半天代码,也搞不明白,而且启动程序后,最小化,然后再启动这个程序,已经启动的依然是最小化,没有反应。只是不能打开第二个实例而已。 展开
3个回答
展开全部
"CApp.cpp"文件的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_SHOWMAXIMIZED);
////////////////////////////////////////////
////////////////////////////////////////////
::SetForegroundWindow(hWndPrevious);
::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
return FALSE;
}
hWndPrevious = ::GetWindow(hWndPrevious, GW_HWNDNEXT);
}
return false;
}
能最大化啊,我刚刚又试了一次,你看一下有没有加上下面的函数,
::ShowWindow(hWndPrevious, SW_SHOWMAXIMIZED);
这个函数就是让界面最大化
还有,你正在运行的程序此时不能有子界面和消息框,就是说你的主界面能操作.但是,即使不能最大化,至少也能弹起来才对。
如果还是不行,你把你的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_SHOWMAXIMIZED);
////////////////////////////////////////////
////////////////////////////////////////////
::SetForegroundWindow(hWndPrevious);
::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
return FALSE;
}
hWndPrevious = ::GetWindow(hWndPrevious, GW_HWNDNEXT);
}
return false;
}
能最大化啊,我刚刚又试了一次,你看一下有没有加上下面的函数,
::ShowWindow(hWndPrevious, SW_SHOWMAXIMIZED);
这个函数就是让界面最大化
还有,你正在运行的程序此时不能有子界面和消息框,就是说你的主界面能操作.但是,即使不能最大化,至少也能弹起来才对。
如果还是不行,你把你的InitInstance函数贴出来我看一下。
展开全部
HANDLE hObject = CreateMutex(NULL,FALSE,"RUN");
if(GetLastError() == ERROR_ALREADY_EXISTS)//程序已经运行
{
CloseHandle(hObject);
ExitProcess(0);
}
if(GetLastError() == ERROR_ALREADY_EXISTS)//程序已经运行
{
CloseHandle(hObject);
ExitProcess(0);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
NO
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询