ďťż

Ładny brzuch

Przy uruchamianiu spradzam czy program działa i jeśli tak to ma go aktywować. Niby coś tam mignie i to wszystko :(
//Sprawdzam czy program już pracuje    CreateMutex (NULL, true, "Program");    if (GetLastError() == ERROR_ALREADY_EXISTS){        Application->MessageBox("Program jest już uruchomiony          ", "Komunikat", MB_OK | MB_ICONEXCLAMATION);        HWND hWnd = FindWindow("T_Program", 0);        SetForegroundWindow(hWnd);        Application->Terminate();    }
Użytkownik PabloX edytował ten post 05 czerwiec 2006, 23:07


ja u siebie wysylam wlasna wiadomosc (WM_USER + X) i przechwytuje wlasna funkcja wiadomosci ... jak jest wlasnie ta to po prostu przywracam aplikacje do top'a i tyle :)

migajek, a jeśli w aplikaji jest otwarte okno modalne to jak w tym momencie odebrac ten komunikat ?

Dlaczego SetForegroundWindow(handle) funkcja nie dział?
Nie działa także użycie BringWindowToTop(handle) :(
Jak przywrócić aplikację z minimalizacji ?
Użytkownik PabloX edytował ten post 06 czerwiec 2006, 18:49
Możesz jeszcze spróbować:SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,0); SetWindowPos(Handle,HWND_NOTOPMOST,Left,Top,Width,Height,0); SetFocus();

// poprawka ;)
Użytkownik Cyrkiel edytował ten post 06 czerwiec 2006, 22:21


SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,0); SetWindowPos(Handle,HWND_NOTOPMOST,Left,Top,Width,Height,0); Bez rezultatu :(

Windows.SetFocus(Handle); Wywala błąd:Invalid use of namespace 'Windows' :blink:
Użytkownik PabloX edytował ten post 06 czerwiec 2006, 22:00

SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,0); SetWindowPos(Handle,HWND_NOTOPMOST,Left,Top,Width,Height,0); Bez rezultatu  :(

Windows.SetFocus(Handle); Wywala błąd:Invalid use of namespace 'Windows' :blink:
Poprawiłem tamto...
Czy na pewno klasa okna = "T_Program"? Nie chodzi o jego tytuł?

Nie mogę bazowac na nazwie okna bo po uruchomienu program modyfikuje jego nazwę przez wyświetlanie wersji więc kod nie zadziała na różnych wersjach programu ;)

Co do kodu - na ekranie pojawia się mignięcie a plikacja dalej pozostaje zminimalizowana :(

Cały kod wygląda tak
__fastcall T_Program::T_Program(TComponent* Owner): TForm(Owner) {    //*    try{        HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "Program_2006");        if (!hMutex)            hMutex = CreateMutex(0, 0, "Program_2006");        else{            HWND hWnd = FindWindow("T_Program", 0);            //SetForegroundWindow(hWnd);            //BringWindowToTop(hWnd);            SetWindowPos(hWnd,HWND_TOPMOST,Left,Top,Width,Height,0);            SetWindowPos(hWnd,HWND_NOTOPMOST,Left,Top,Width,Height,0);            SetFocus();            //::BringWindowToTop(hWnd); // SCOPE :: !            //::SetActiveWindow(hWnd);            Application->MessageBox("Program 2006 jest ju¿ uruchomiony          ", "Uruchamianie Program 2006", MB_OK | MB_ICONEXCLAMATION);            Application->Terminate();        }    }    catch (Exception &exception){        Application->ShowException(&exception);    }    //*/ } //--------------------------------------------------------------------------- void __fastcall T_Program::FormCreate(TObject *Sender) {//OnCreate    //Sprawdzam czy program ju¿ pracuje    /*    CreateMutex (NULL, true, "Program_2006");    if (GetLastError() == ERROR_ALREADY_EXISTS){        HWND hWnd = FindWindow("T_Program", 0);        //SetForegroundWindow(hWnd);        //BringWindowToTop(hWnd);        //SetWindowPos(hWnd,HWND_TOPMOST,Left,Top,Width,Height,0);        //SetWindowPos(hWnd,HWND_NOTOPMOST,Left,Top,Width,Height,0);        //SetFocus();        //::BringWindowToTop(hWnd);        //::SetActiveWindow(hWnd);        Application->MessageBox("Program 2006 jest ju¿ uruchomiony          ", "Uruchamianie Program 2006", MB_OK | MB_ICONEXCLAMATION);        Application->Terminate();    }    //*/    //Wypisanie informacji o kompilacji    AnsiString data = __DATE__;// Data kompilacji    AnsiString wersja;    //wersja = Odczytaj_wersje(); //Odczytuje wewnêtrzn± wersjê programu (pliku)    _Program->Caption = "Program 2006  -  v...  " + data; } //--------------------------------------------------------------------------- void __fastcall T_Program::KoniecClick(TObject *Sender) {    Close(); } //---------------------------------------------------------------------------

Czy możliwe jest aby program szukając okna przez
HWND hWnd = FindWindow(0, "Program 2006"); SetForegroundWindow(hWnd); odnajdywał sam siebie i chciał się przywrócić z minimalizacji ?

Idąc tym tropem zrobiłem coś takiego. Teraz juz na pewniaka odnajduje okno wcześniej uruchomionej aplikacji. Rezultat jest jednak taki sam :( Tylko mignięcie :mad:

_fastcall T_Program::T_Program(TComponent* Owner): TForm(Owner) {    try{        HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "Program_2006");        if (!hMutex)            hMutex = CreateMutex(0, 0, "Program_2006");        else{            //HWND hWnd = FindWindow(0, "Program 2006");            //SetForegroundWindow(hWnd);            //BringWindowToTop(hWnd);            //SetWindowPos(hWnd,HWND_TOPMOST,Left,Top,Width,Height,0);            //SetWindowPos(hWnd,HWND_NOTOPMOST,Left,Top,Width,Height,0);            //SetFocus();            //::BringWindowToTop(hWnd); // SCOPE :: !            //::SetActiveWindow(hWnd);            Application->MessageBox("Program 2006 jest już uruchomiony          ", "Uruchamianie Program 2006", MB_OK | MB_ICONEXCLAMATION);            EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM) 0);            Application->Terminate();        }    }    catch (Exception &exception){        Application->ShowException(&exception);    } } //--------------------------------------------------------------------------- bool CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {    char WindowName[80], ClassName[80];    AnsiString window_name, class_name, wzor, bufor;    GetWindowText(hWnd, WindowName, 80);    GetClassName(hWnd, ClassName, 80);    wzor = "Program 2006";    window_name = AnsiString(WindowName);    class_name  = AnsiString(ClassName);    bufor = window_name.SubString(1, wzor.Length() ); //Kopiowanie stałego ciągu    if( SameText(bufor, wzor)== true && class_name == "T_Program"){ //Poruwnanie bufora ze wzorem        HWND hPrg = FindWindow(0, window_name.c_str());        //SetForegroundWindow(hPrg);        //BringWindowToTop(hPrg);        ::BringWindowToTop(hPrg); // SCOPE :: !        ::SetActiveWindow(hPrg);        return false;    }    else{        return true;    } } //------------------------------------------------------------------------------ void __fastcall T_Program::FormCreate(TObject *Sender) {//OnCreate    //Wypisanie informacji o kompilacji    AnsiString data = __DATE__;// Data kompilacji    AnsiString wersja;    //wersja = Odczytaj_wersje(); //Odczytuje wewnętrzną wersję programu (pliku)    _Program->Caption = "Program 2006  -  v1.0  " + data; } //--------------------------------------------------------------------------- void __fastcall T_Program::Button1Click(TObject *Sender) {    Close(); } //---------------------------------------------------------------------------
Użytkownik PabloX edytował ten post 09 czerwiec 2006, 19:37
Brakowało tego        SendMessage(hPrg, WM_SYSCOMMAND, SC_RESTORE,0);  //Przywrócenie okna        SetForegroundWindow(hPrg);                       //Przesunięcie okna na wierzch

Cały kod wygląda tak :D
__fastcall T_Program::T_Program(TComponent* Owner): TForm(Owner) {    try{        HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "Program_2006");        if (!hMutex)            hMutex = CreateMutex(0, 0, "Program_2006");        else{            Application->MessageBox("Program 2006 jest już uruchomiony          ", "Uruchamianie Program 2006", MB_OK | MB_ICONEXCLAMATION);            EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM) 0);            Application->Terminate();        }    }    catch (Exception &exception){        Application->ShowException(&exception);    } } //--------------------------------------------------------------------------- bool CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {    char WindowName[80], ClassName[80];    AnsiString window_name, class_name, wzor, bufor;    GetWindowText(hWnd, WindowName, 80);    GetClassName(hWnd, ClassName, 80);    wzor = "Program 2006";    window_name = AnsiString(WindowName);    class_name  = AnsiString(ClassName);    bufor = window_name.SubString(1, wzor.Length() ); //Kopiowanie stałego ciągu    if( SameText(bufor, wzor)== true && class_name == "T_Program"){ //Poruwnanie bufora ze wzorem        HWND hPrg = FindWindow(0, window_name.c_str());        SendMessage(hPrg, WM_SYSCOMMAND, SC_RESTORE,0);  //Przywrócenie okna        SetForegroundWindow(hPrg);                       //Przesunięcie okna na wierzch        SetWindowText( hPrg, "Byłem tu..."); //Taki dowcip;-)        return false;    }    else{        return true;    } } //------------------------------------------------------------------------------ void __fastcall T_Program::FormCreate(TObject *Sender) {//OnCreate    //Wypisanie informacji o kompilacji    AnsiString data = __DATE__;// Data kompilacji    AnsiString wersja;    //wersja = Odczytaj_wersje(); //Odczytuje wewnętrzną wersję programu (pliku)    _Program->Caption = "Program 2006  -  v1.0  " + data; } //--------------------------------------------------------------------------- void __fastcall T_Program::Button1Click(TObject *Sender) {    Close(); } //---------------------------------------------------------------------------

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •