komunikaty, komunikaty, komunikaty

0

sprawa byla juz na forum bo czytelem z 10 postow o tym , ale nie znalazlem rozwiazania. Jest tak , mam program i jesli on przestaje byc sktywny to sie wrzuca do Traya (tylko nie CoolTray'em) procedurką :

procedure TaskbarIconShow;
begin
with NotifRec do
begin
cbSize := SizeOf(NotifRec);
Wnd := MainFrm.Handle;
uID := IconId;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallbackMessage := WM_MYNOTIFYMSG;
hIcon := MainFrm.Icon.Handle;
szTip := 'xxx';
end;
if Shell_NotifyIcon(NIM_ADD,@NotifRec) then
begin
ShowWindow(MainFrm.Handle,SW_HIDE);
end;
end;

no i teraz jak on siedzi w tym Tray;u to jak jest zamykany windows - to sie nie zamyka (ani program ani windows : ( ) no i dlaczego ? w procedurze OnClose mam:

If Closing = True then Action := caFree else TaskBarIconShow;

CLosing to dodatkowa zmienn ktora informuje czy program ma sie zamknąc czy nie, dodatkowo mam procedure:

procedure TMainFrm.WMSysCommand(var Message: TWMSysCommand);
Begin
case Message.CmdType of
SC_MINIMIZE :
TaskbarIconShow;
SC_CLOSE :
TaskBarIconShow;
{ 61458 :
Begin
TaskBarIconHide;
Closing := True;
Close;
End; }
else
inherited;
end;
End;

no i pytanie jaki jest ten komunikat jak sie wylacza winda, znaczy jaki jest wysylany do programu ? probowalem WM_QUERYENDSESSION ale nie dziala, jak dalem w tej ostatniej zeby mi napisal numer komunikatu przy zamykaniu windy (ShowMessage(IntToStr(Message.CmdType))) to mi pisze 61458 ale tylko jak uruchamiam program w Delphi, a jak z pod windowsa to nie wyskakuje ten komunikat : ( juz nie wiem co jest : (
z gory dziekuje --pozdrowienia

0

61458 to tez nie to nawet (pomylilo mi sie) : (--pozdrowienia

0

Musisz użyć WM_QUERYENDSESSION i zwrócić True. Jeżeli otrzymasz jeszcze WM_ENDSESSION, to znaczy, że nastąpi zamknięcie. Jeżeli nie, to znaczy, że jeden z programów odmówił posłuszeństwa i nie chce się zamknąć :(
Jeżeli otrzymasz komunikat i dalej nie będzie się zamykać to wykończ system ExitWindowEx (albo jeszcze bardziej brutalnymi metodami ;) )--Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

0

kurcze hmm nie zabardzo czaje : ( nie napisal bys mi zarysu procedurki ? jak to zwrocic True ? chodzi mi o to aby jak program otrzyma message'a ze sie winda wylacza to zeby sie wylaczyl : |

z gory dziekuje : )--pozdrowienia

0

aha a system to winxp jak by to mialo znaczenie : )--pozdrowienia

0

Chyba coś takiego powinno być. Nie chce mi się eksperymentować z włączanie i wyłączaniem systemu. Nie testowałem.

W Windows SDK jest opisana procedura DefWindowProc. To ona powinna zwracać true. Wydaje mi się, że musisz nadpisać DefWndProc i wrzucić coś takiego:

if Msg.message = WM_QUERYENDSESSION then
begin
r := Application.MessageBox('Shut down?','WM_QUERYENDSESSION', MB_YESNO);
Result := r = IDYES;
end;
--Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

0

Dryobates napisał:
W Windows SDK jest opisana procedura DefWindowProc. To ona powinna zwracać true. Wydaje mi się, że musisz nadpisać DefWndProc i wrzucić coś takiego:
Result := r = IDYES;

O ile ja kojarzę, to powinno być raczej coś w rodzaju:
Msg.Result:=1
lub
Msg.Result:=0
któreś robiło za True, chyba 1 ale nie pamiętam.--Vogel [Delphi 6 PE]

Life is just a dream, you know...
[Cowboy Bebop]

1 użytkowników online, w tym zalogowanych: 0, gości: 1