Usuwanie ikony programu z paska zadań.

dział ogólny

Usuwanie ikony programu z paska zadań.

Nowy postprzez mko000 » niedziela, 10 stycznia 2010, 13:04

Witam. Jest jakas jeszcze możliwość oprócz Form1->Hide na ukrycie programu ? tak aby nie było go widać na pasku.
Ostatnio edytowano poniedziałek, 11 stycznia 2010, 15:30 przez Cyfrowy Baron, łącznie edytowano 1 raz
Powód: Zmieniono tytuł by lepiej opisywał problem.
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
PodziÄ™kowaÅ‚ : 35
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPChrome

Re: Ukrywanie aplikacji

Nowy postprzez Cyfrowy Baron » niedziela, 10 stycznia 2010, 13:18

► patrz serwis: Cyfrowy Baron dziaÅ‚: porady -> API -> usuwanie ikony programu z paska zadaÅ„.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
mko000
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Ukrywanie aplikacji

Nowy postprzez mko000 » niedziela, 10 stycznia 2010, 14:18

Cos nie działa ta porafa. Ani w zdażeniu on show ani w buttonie nie chowa mi z paska.
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
PodziÄ™kowaÅ‚ : 35
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPChrome

Re: Ukrywanie aplikacji

Nowy postprzez Cyfrowy Baron » niedziela, 10 stycznia 2010, 14:22

Otwórz plik projektu np. Project.cpp i odszukaj linię:

Kod: Zaznacz cały
Application->MainFormOnTaskBar = true;


następnie usuń ją lub ustaw na false:

Kod: Zaznacz cały
Application->MainFormOnTaskBar = false;

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
mko000
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Ukrywanie aplikacji

Nowy postprzez mko000 » niedziela, 10 stycznia 2010, 15:26

Ani ta porada ani dwie razem nie dają żadnego rezultatu. Nadal widoczny jest program na pasku.
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
PodziÄ™kowaÅ‚ : 35
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPChrome

Re: Ukrywanie aplikacji

Nowy postprzez wargo » niedziela, 10 stycznia 2010, 15:31

Użyj komponentu TTrayIcon. Jeśli nie ustawisz ikony w tym komponencie to w polu systemowym (tray) ani na pasku zadań program nie będzie widoczny.

Za ten post autor wargo otrzymał podziękowanie od:
mko000
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    WindowsMozilla

Re: Ukrywanie aplikacji

Nowy postprzez Cyfrowy Baron » niedziela, 10 stycznia 2010, 18:07

Użycie komponentu TTrayIcon jest rzeczywiście najprostszym wyjściem, szczególnie, że musisz jednak gdzieś umieścić uchwyt do programu, więc będziesz miał ikonę w zasobniku systemowym.

Przyjrzałem się temu problemowi bliżej i znalazłem rozwiązanie.
Problem polega na tym, że aplikacja stworzona w C++Builder 2010 (być może również 2009) nie tworzy własnego uchwytu, trzeba go utworzyć, trzeba również wyłączyć reprezentowanie aplikacji poprzez przycisk na pasku zadań, to oczywiście przycisku jeszcze nie usuwa, czyli:

w C++Builder 2007 usuwamy z pliku nagłówkowego aplikacji, np. Project.cpp ten kod:
Kod: Zaznacz cały
SetApplicationMainFormOnTaskBar(Application, true);


lub też ustawiamy go na false:
Kod: Zaznacz cały
SetApplicationMainFormOnTaskBar(Application, false);


w C++Builder 2009 i 2010 usuwamy z pliku nagłówkowego aplikacji, np. Project.cpp ten kod:
Kod: Zaznacz cały
Application->MainFormOnTaskBar = true;


lub ustawiamy go na false:
Kod: Zaznacz cały
Application->MainFormOnTaskBar = false;


Te funkcje zostały dodane do aplikacji ze względu na system Vista i efekt Windows Vista Aero, jeżeli chcemy żeby w systemie Vista działał efekt Aero w odniesieniu do aplikacji to powyższe funkcje muszą być włączone.

W środowisku C++Builder 2009 i 2010 trzeba utworzyć uchwyt do aplikacji, w tym celu dodajemy np. w konstruktorze klasy taką funkcję:

Kod: Zaznacz cały
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   Application->CreateHandle();
}


teraz można już normalnie usuwać ikonę z paska zadań tak jak to opisałem w poradzie, czyli:

Kod: Zaznacz cały
ShowWindow(Application->Handle,  SW_HIDE);


Tutaj tez zamiast tworzyć funkcję przechwytującą minimalizację i maksymalizację programu można pójść na łatwiznę i skorzystać z komponentu TApplicationEvents (zakładka Additional), który to komponent oferuje gotowe zdarzenia przechwytywania komunikatów.
Tworzymy więc w ApplicationEvents1 zdarzenia OnMinimize i OnRestore, i umieszczamy w nich taki kod:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Minimize(TObject *Sender)
{
  ShowWindow(Application->Handle, SW_HIDE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Restore(TObject *Sender)
{
  ShowWindow(Application->Handle, SW_HIDE);
}
//---------------------------------------------------------------------------


Niemniej jednak komponent TTrayIcon jest rozwiązaniem lepszym, jeżeli chcesz mieć ikonę w zasobniku systemowym, ale nie usunie programu z paska zadań, nadal tam będzie. Dlatego lepszym rozwiązaniem jest komponent TCTrayIcon (zakładka Samples). Umieszczasz go na formularzu i podłączasz pod ImageList jeżeli chcesz zmienić ikonę lub zrobić animowaną ikonę w zasobniku. Potem ustawiasz Visible na true i Hide na true, ale i to spowoduje usuniecie programu z paska zadać tylko przy minimalizacji programu, po przywróceniu pasek wróci.
Jak wiec widzisz musisz wszystko połączyć czyli to co pisałem na początku z komponentem TApplicationEvents i TTrayIcon lub TCTrayIcon.

Jeżeli chcesz używać komponentu TCTrayIcon to poszukaj w katalogu:

C:\Documents and Settings\All Users\Dane aplikacji\

pliku: Trayicon.res i przekopiuj go do katalogu: C:\Program Files\Embarcadero\RAD Studio\7.0\lib\



Do wargo: to co się sprawdza w systemie Windows 98 i środowisku C++Builder 6, niestety najczęściej już nie działa w Windows XP i nowszych środowiskach.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
mko000
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Ukrywanie aplikacji

Nowy postprzez mko000 » niedziela, 10 stycznia 2010, 22:57

Świetnie wytłumaczone Cyfrowy Baronie. Dziękuję. Przydało by się tą poradę aktualizować w serwisie. Teraz działa jak należy :) A jak do tego ukryć formę ?
Piszę program do informowania mnie o nowej poczcie na skrzynce i chciałbym żeby to było jak najmniej widoczne. Form1->Hide(); w Zdarzeniu OnCreate nie ukrywa formy

//Edit
Application->ShowMainForm = false;
Załatwiło sprawę.
Pozdrawiam
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
PodziÄ™kowaÅ‚ : 35
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPChrome

Re: Ukrywanie aplikacji

Nowy postprzez Witold » poniedziaÅ‚ek, 11 stycznia 2010, 10:22

Cyfrowy Baron napisał(a):W środowisku C++Builder 2009 i 2010 trzeba utworzyć uchwyt do aplikacji, w tym celu dodajemy np. w konstruktorze klasy taką funkcję:

Kod: Zaznacz cały
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   Application->CreateHandle();
}



W helpie jest żeby tego nie robić: "Do not call CreateHandle directly. In EXEs, the application's constructor calls CreateHandle. In DLLs it does not."
http://docwiki.embarcadero.com/VCL/en/F ... eateHandle
Jesteś pewien że tak można ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    Windows XPOpera

Re: Ukrywanie aplikacji

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 11 stycznia 2010, 11:13

Czy tak można? Najwyraźniej tak, jeżeli chcesz usunąć ikonę programu z paska zadań. Problem w tym, że konstruktor właśnie nie tworzy tego uchwytu w środowiskach C++Builder 2009 i 2010. A co to wogóle znaczy: Do not call CreateHandle directly.
Nie wywołuj CreateHandle od razu. Więc może rzeczywiście lepiej tego nie wywoływać w konstruktorze klasy, ale dopiero gdy zachodzi taka potrzeba. Help nie precyzuje co się stanie, gdy funkcja zostanie użyta od razu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Ukrywanie aplikacji

Nowy postprzez Witold » poniedziaÅ‚ek, 11 stycznia 2010, 12:46

Cyfrowy Baron napisał(a):Problem w tym, że konstruktor właśnie nie tworzy tego uchwytu w środowiskach C++Builder 2009 i 2010.

Co przez to rozumiesz ? U mnie (test 2010). Wartość TApplication->Handle jest ustawiona.

Cyfrowy Baron napisał(a):A co to wogóle znaczy: Do not call CreateHandle directly.
Nie wywołuj CreateHandle od razu. Więc może rzeczywiście lepiej tego nie wywoływać w konstruktorze klasy, ale dopiero gdy zachodzi taka potrzeba. Help nie precyzuje co się stanie, gdy funkcja zostanie użyta od razu.



The New Kosciuszko Foundation Dictionary napisał(a):directly
adv.
1. bezpośrednio; wprost.
2. Br. przest. zaraz.
conj.
Br. gdy tylko, zaraz po tym, jak.


W helpie jest napisane że CreateHandle wywołuje konstruktor TApplication "application's constructor calls CreateHandle", a samemu bezpośrednio nie trzeba CreateHandle wywoływać (przynajmniej ja to tak rozumiem).
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    Windows XPOpera

Re: Ukrywanie aplikacji

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 11 stycznia 2010, 13:01

Co przez to rozumiesz ? U mnie (test 2010). Wartość TApplication->Handle jest ustawiona.


Sugerowałem się tym, że jeżeli do formy głównej programu wyślę komunikat:

Kod: Zaznacz cały
ShowWindow(this->Handle,  SW_HIDE);


to okno zostanie ukryte, ale jeżeli ten sam komunikat w C++Builder 2010 wyślę do aplikacji:

Kod: Zaznacz cały
ShowWindow(Application->Handle,  SW_HIDE);


to nic się nie dzieje, więc zakładam, ze komunikat nie dotarł, a skoro nie dotarł to funkcja nie pobrała uchwytu do aplikacji.
Jeżeli wysłanie komunikatu poprzedzę funkcją CreateHandle(), to komunikat dociera do aplikacji i znika przycisk z paska zadań:

Kod: Zaznacz cały
   Application->CreateHandle();
   ShowWindow(Application->Handle,  SW_HIDE);


Szczerze mówiąc nie sprawdzałem, czy to problem uchwytu, tylko przyjąłem takie założenie, więc potem poszukałem i znalazłem funkcję CreateHandle(), użyłem jej nie sprawdzając do czego służy, zasugerowałem się nazwą.

W słowniku Collinsa directly oznacza bezpośrednio, ale to może mieć wiele znaczeń:
przysłówki: bezpośrednio, wprost, prosto, otwarcie, szczerze, dokładnie, zupełnie, całkowicie, kategorycznie, wkrótce, od razu, zaraz, niebawem, w prostej linii
spójniki: skoro, skoro tylko, zaraz, zaraz po tym, jak, od razu, natychmiast.

W helpie jest napisane że CreateHandle wywołuje konstruktor TApplication "application's constructor calls CreateHandle", a samemu bezpośrednio nie trzeba CreateHandle wywoływać (przynajmniej ja to tak rozumiem).


A mi bardziej pasował tutaj spójnik łączący dwa wyrazy niż przysłówek określający cechy.

Po pierwsze funkcja jest dostępna, czyli czemuś ma służy, po wtóre jej użycie rozwiązuje niektóre problemy i nie wywołuje żadnych błędów.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Ukrywanie aplikacji

Nowy postprzez Witold » poniedziaÅ‚ek, 11 stycznia 2010, 16:44

Cyfrowy Baron napisał(a):to okno zostanie ukryte, ale jeżeli ten sam komunikat w C++Builder 2010 wyślę do aplikacji:

Kod: Zaznacz cały
ShowWindow(Application->Handle,  SW_HIDE);


to nic siÄ™ nie dzieje,

u mnie jest inaczej, dla Application->MainFormOnTaskBar = false; znika z paska, też 2010, system XP, odpalane po kliknięciu na button'a.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    Windows XPOpera

Re: Usuwanie ikony programu z paska zadań.

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 11 stycznia 2010, 17:53

Zabawne, ale u mnie dziś też zadziałało prawidłowo, bez wywoływania funkcji CreateHandle, mimo iż wczoraj było inaczej. Być może dlatego, że wczoraj komputer pracował bez przerwy od rana i powstały jakieś błędy w systemie, a może w tle działał jakiś program, który wywoływał błąd, nie wiem, ale funkcja CreateHandle rozwiązywała ten problem, więc może być przydatna.
Należałby sprawdzić jakie zagrożenia niesie za sobą użycie funkcji CreateHandle, gdyż w helpie poza informacja, że nie należy tak robić nic na ten temat nie ma, wiec być może użycie tej funkcji nie pociąga za sobą żadnych przykrych konsekwencji, a skoro u mnie błąd w systemie wywołał błąd w działaniu programu, to być może czasami warto z niej korzystać.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron