Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как поместить 1 экземпляр программы на первый план (http://forum.oszone.net/showthread.php?t=59681)

lehha 19-01-2006 10:12 394482

Как поместить 1 экземпляр программы на первый план
 
Всем привет!
Опять возник вопросик.
Мне нужно при запуске 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 394506

попробуй SetWindowPos(oWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);

lehha 19-01-2006 11:13 394512

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

lehha 19-01-2006 11:18 394516

Да забыл сказать, что у меня диалоговое окно.

Abell2000 22-01-2006 05:39 395785

Может 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 396190

Отладка что показывает?
Код:

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 396425

Спасибо обязательно все попробую


Время: 14:44.

Время: 14:44.
© OSzone.net 2001-