Войти

Показать полную графическую версию : Как поместить 1 экземпляр программы на первый план


lehha
19-01-2006, 10:12
Всем привет!
Опять возник вопросик.
Мне нужно при запуске 2 экземпляра программы активизировать 1, т.е. если прога запущена и при попытке запусить её 2 раз 1 копия выдвигалась на первый план.
Вот код что я накалябал, все проблема в том что я не могу окно поместить на первый план((

HANDLE hMutex = CreateMutex (NULL, TRUE, "Моя программа");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
HWND oWnd = NULL;
oWnd = ::FindWindow(NULL,"Моя программа");
//if (::IsIconic(oWnd))
// ::SendMessage(oWnd, WM_SYSCOMMAND, SC_RESTORE,0);
::SetForegroundWindow(oWnd);
::ShowWindow(oWnd, SW_RESTORE);
CloseHandle(hMutex);
ExitProcess(0);
}

Спасибо зарание!

pva
19-01-2006, 10:59
попробуй SetWindowPos(oWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);

lehha
19-01-2006, 11:13
pva
Непомогло, у меня такое чувство, что oWnd = ::FindWindow(NULL,"Моя программа"); не возвращаяет хендел окна. Можно ли как то активизировать окно через hMutex??

lehha
19-01-2006, 11:18
Да забыл сказать, что у меня диалоговое окно.

Abell2000
22-01-2006, 05:39
Может ShowWindow и SetForegroundWindow местами поменять, вот ето 100% будет работать:

HANDLE checkMutex=CreateMutex(NULL,TRUE,"Mutex unique name");
if(GetLastError()==ERROR_ALREADY_EXISTS){
HWND sypH=FindWindow("TMainWindowClass","MainWindowCaption");
if(sypH!=NULL){
HWND ownWS=GetWindow(sypH,GW_OWNER);
ShowWindow(ownWS,SW_RESTORE);
SetForegroundWindow(sypH);
}
}else

pva
23-01-2006, 13:06
Отладка что показывает?

std::string errorMsg(const char* msg, int code)
{
std::ostringstream ss;
ss << msg << " failed with os error " << code;
return ss.str();
};

try
{
hwnd1 = FindWindow(...);
if (!hwnd1) throw std::runtime_error(errorMsg("FindWindow", GetLastError()));
if (!SetWindowPos(...)) throw std::runtime_error(errorMsg("SetWindowPos", GetLastError()));
}
catch(std::exception& e)
{
// вывод последней ошибки
MessageBox(0, e.what(), 0, MB_ICONERROR|MB_OK);
throw;
}

lehha
24-01-2006, 00:46
Спасибо обязательно все попробую




© OSzone.net 2001-2012