Ĺadny brzuch
Chciałem w nazwie tematu umieścić "Jak zrobić, żeby po załadowania ikonki do traya, nie pokazywało się okno?", ale niestety ta nazwa byłaby za długa, więc dałem tak jak jest.
Chodzi mi o to, że aby pokazała się ikonka w zasobniku musi się pojawić też okno, do którego wysyłane są komunikaty z ikonki. I właśnie jak zrobić tak, żeby to okno się nie pokazywało, tylko sama ikonka? Klikasz na plik .exe i dodaje się tylko ikonka do traya. Do stworzenia ikonki używam zwykłego polecenia:
Shell_NotifyIcon(NIM_ADD, @TrayIconData);
które jest wywoływane w zdarzeniu OnCreate formy głównej. Nawet jak zmienię właściwość Visible formy na false i tak się pokazuje. Co zrobić, żeby tak nie było?
jeszcze musisz zmienić wygląd okna początkowego z appwindow na toolwindow
polecam zajrzeć do eksperta 5/2004 tam gdzie była przypominajka pisana. tam właśnie taki bajer zrobili :)
Chodzi o okno aplikacji, a nie formę?
Zmnieniłem, używając funkcji SetWindowLong. Ale to jest po to, aby aplikacja nie pokazywała się na pasku zadań, więc nie ma nic wspólnego z tym, o co pytałem :P
Artykuł o Przypominajce znam :)
Ukrycie okna podczas uruchamiania?? Project -> View source... i daj tak:var msg:tmsg; begin Application.Initialize; Form1:=TForm1.Create(Application); Application.Run; { dalej stwórz ikonę na taskbarze; na końcu Shell_NotifyIcon()} while GetMessage(msg,0,0,0) do begin TranslateMessage(msg); DispatchMessage(msg); end;
Dobra, dzięki, udało mi się to zrobić i ikonka pojawia się w trayu bez otwierania okna... Jeżeli dam
TrayIcon.hWnd := Form1.Handle;
to wtedy wysyła komunikaty do okna Form1 i jest wszystko dobrze, a czy może tak być, żeby wysyłało do okna aplikacji? Bo rozumiem, że pętla while ma odbierać komunikaty, jednak nic nie odbiera! Jak dałem, żeby wysyłało komunikaty do okna aplikacji:
TrayIcon.hWnd := Application.Handle;
i zastosowałem instrukcję if w pętli while:
while GetMessage(msg, 0, 0, 0) do begin TranslateMessage(msg); DispatchMessage(msg); if (Msg.message = WM_USER + 1) and (Msg.lParam = WM_RBUTTONDOWN) then begin ShowMessage('true'); end; end;
to ani razu się nie wyświetlał komunikat true, jak kliknąłem prawym przyciskiem myszy na ikonkę. Czy może ta pętla to jest tylko po to, aby nie program się nie zamknął? Bo jak usunąłem tą pętlę to się zamykał. Do czego służą funkcje TranslateMessage, DispatchMessage, GetMessage (GetMessage, domyślam się, że odbiera komunikaty z okna, którego uchwyt jest w 2. parametrze, przekazuje komunikat do zmiennej podanej jako 1. parametr). I jak zmieniłem warunek pętli while na "GetMessage(msg, Application.Handle, 0, 0)" to też nie odbierał komunikatów ikonki.
Acha i jeszcze typ zmiennej Msg Ci się pomylił, bo powinno być
var msg: tagMSG
Użytkownik Mek edytował ten post 27 sierpień 2005, 11:44
Acha i jeszcze typ zmiennej Msg Ci się pomylił, bo powinno być
var msg: tagMSG Etam nie pomyliło mi się :PZ windows.pas: type TMsg = tagMsg;Komunikaty pójdą tylko do okienka, do Application raczej to nie wyjdzie ;) BTW 'Zauważ' debuggerem, że program w ogóle nie przechodzi procki GetMessage(), tylko się na niej zatrzymuje :D
Tak, zauważyłem to, że następuje zatrzymanie na
while GetMessage(Msg, 0, 0, 0) do
i nic się w środku nie wykonuje, bo dałem sobie
while GetMessage(Msg, Application.Handle, 0, 0) do begin ShowMessage('true'); // dalsze polecenia end;
i ani razu nie pokazało się okienko z napisem "true". A i jeszcze z "TMsg" nie dało mi się skomplikować, spojrzałem w dymek i było "tagMSG" i zmieniłem typ zmiennej.
Dlatego napisałem, że się pomyliłeś, ale widzę, że te dwa typy to jedno i to samo :P To ja się pomyliłem ;)
A do czego służą polecenia TranslateMessage i DispatchMessage? A tak w ogóle to zamiast pętli którą dałeś mogłaby być ta, tzn. pełniła by taką samą funkcję?
while true do begin Application.ProcessMessages; end;
Użytkownik Mek edytował ten post 27 sierpień 2005, 19:20
A tak w ogóle to zamiast pętli którą dałeś mogłaby być ta, tzn. pełniła by taką samą funkcję?
while true do begin Application.ProcessMessages; end; W sumie tak (BTW usuń begin i end z tego :P)
A tymi translatami i dispatchami się nie przejmuj - bez okienka niczego nie zrobisz ;)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Chodzi mi o to, że aby pokazała się ikonka w zasobniku musi się pojawić też okno, do którego wysyłane są komunikaty z ikonki. I właśnie jak zrobić tak, żeby to okno się nie pokazywało, tylko sama ikonka? Klikasz na plik .exe i dodaje się tylko ikonka do traya. Do stworzenia ikonki używam zwykłego polecenia:
Shell_NotifyIcon(NIM_ADD, @TrayIconData);
które jest wywoływane w zdarzeniu OnCreate formy głównej. Nawet jak zmienię właściwość Visible formy na false i tak się pokazuje. Co zrobić, żeby tak nie było?
jeszcze musisz zmienić wygląd okna początkowego z appwindow na toolwindow
polecam zajrzeć do eksperta 5/2004 tam gdzie była przypominajka pisana. tam właśnie taki bajer zrobili :)
Chodzi o okno aplikacji, a nie formę?
Zmnieniłem, używając funkcji SetWindowLong. Ale to jest po to, aby aplikacja nie pokazywała się na pasku zadań, więc nie ma nic wspólnego z tym, o co pytałem :P
Artykuł o Przypominajce znam :)
Ukrycie okna podczas uruchamiania?? Project -> View source... i daj tak:var msg:tmsg; begin Application.Initialize; Form1:=TForm1.Create(Application); Application.Run; { dalej stwórz ikonę na taskbarze; na końcu Shell_NotifyIcon()} while GetMessage(msg,0,0,0) do begin TranslateMessage(msg); DispatchMessage(msg); end;
Dobra, dzięki, udało mi się to zrobić i ikonka pojawia się w trayu bez otwierania okna... Jeżeli dam
TrayIcon.hWnd := Form1.Handle;
to wtedy wysyła komunikaty do okna Form1 i jest wszystko dobrze, a czy może tak być, żeby wysyłało do okna aplikacji? Bo rozumiem, że pętla while ma odbierać komunikaty, jednak nic nie odbiera! Jak dałem, żeby wysyłało komunikaty do okna aplikacji:
TrayIcon.hWnd := Application.Handle;
i zastosowałem instrukcję if w pętli while:
while GetMessage(msg, 0, 0, 0) do begin TranslateMessage(msg); DispatchMessage(msg); if (Msg.message = WM_USER + 1) and (Msg.lParam = WM_RBUTTONDOWN) then begin ShowMessage('true'); end; end;
to ani razu się nie wyświetlał komunikat true, jak kliknąłem prawym przyciskiem myszy na ikonkę. Czy może ta pętla to jest tylko po to, aby nie program się nie zamknął? Bo jak usunąłem tą pętlę to się zamykał. Do czego służą funkcje TranslateMessage, DispatchMessage, GetMessage (GetMessage, domyślam się, że odbiera komunikaty z okna, którego uchwyt jest w 2. parametrze, przekazuje komunikat do zmiennej podanej jako 1. parametr). I jak zmieniłem warunek pętli while na "GetMessage(msg, Application.Handle, 0, 0)" to też nie odbierał komunikatów ikonki.
Acha i jeszcze typ zmiennej Msg Ci się pomylił, bo powinno być
var msg: tagMSG
Użytkownik Mek edytował ten post 27 sierpień 2005, 11:44
Acha i jeszcze typ zmiennej Msg Ci się pomylił, bo powinno być
var msg: tagMSG Etam nie pomyliło mi się :PZ windows.pas: type TMsg = tagMsg;Komunikaty pójdą tylko do okienka, do Application raczej to nie wyjdzie ;) BTW 'Zauważ' debuggerem, że program w ogóle nie przechodzi procki GetMessage(), tylko się na niej zatrzymuje :D
Tak, zauważyłem to, że następuje zatrzymanie na
while GetMessage(Msg, 0, 0, 0) do
i nic się w środku nie wykonuje, bo dałem sobie
while GetMessage(Msg, Application.Handle, 0, 0) do begin ShowMessage('true'); // dalsze polecenia end;
i ani razu nie pokazało się okienko z napisem "true". A i jeszcze z "TMsg" nie dało mi się skomplikować, spojrzałem w dymek i było "tagMSG" i zmieniłem typ zmiennej.
Dlatego napisałem, że się pomyliłeś, ale widzę, że te dwa typy to jedno i to samo :P To ja się pomyliłem ;)
A do czego służą polecenia TranslateMessage i DispatchMessage? A tak w ogóle to zamiast pętli którą dałeś mogłaby być ta, tzn. pełniła by taką samą funkcję?
while true do begin Application.ProcessMessages; end;
Użytkownik Mek edytował ten post 27 sierpień 2005, 19:20
A tak w ogóle to zamiast pętli którą dałeś mogłaby być ta, tzn. pełniła by taką samą funkcję?
while true do begin Application.ProcessMessages; end; W sumie tak (BTW usuń begin i end z tego :P)
A tymi translatami i dispatchami się nie przejmuj - bez okienka niczego nie zrobisz ;)