Ĺ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
//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(); } //---------------------------------------------------------------------------