Aktív témák
-
emre33
addikt
fél siker ! Az általad írtakat pontosan megcsináltam és Müködött ! Szépen sorba kizárásos alapon megprobáltam kiszüri mi lehet a gázos dolog a pogramban, és kiderült !
Ha a mükdöd(fentebb általad irt programhoz) hozzáadom a NMHTTP1 nevü komponenst( 6-os delphit használok) nem tudja a windows bezárni a programot, NMHTTP1 pedig nem tudom nélkülözni.
vmi tipp esetleg ? -
zenit
tag
Nem tippelgetek tovább, valahogy így kellene csinálnod:
(hosszú lesz, de igazából egyszerű. :) )
const
WM_NOTIFY_ICON = WM_USER;
type
TMainForm = class(TForm)
PopupMenu: TPopupMenu;
MenuShow: TMenuItem;
MenuExit: TMenuItem;
HideButton: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure MenuShowClick(Sender: TObject);
procedure MenuExitClick(Sender: TObject);
procedure HideButtonClick(Sender: TObject);
private
procedure AddNotifyIcon;
procedure DeleteNotifyIcon;
procedure WMNotifyIcon(var Msg: TMessage); message WM_NOTIFY_ICON;
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.AddNotifyIcon;
var
NotifyIconData: TNotifyIconData;
begin
FillChar(NotifyIconData, SizeOf(NotifyIconData), 0);
with NotifyIconData do
begin
cbSize := SizeOf(NotifyIconData);
Wnd := Handle;
uID := 0;
uFlags := NIF_ICON or NIF_MESSAGE;
uCallbackMessage := WM_NOTIFY_ICON;
hIcon := Icon.Handle;
end;
Shell_NotifyIcon(NIM_ADD, Addr(NotifyIconData));
end;
procedure TMainForm.DeleteNotifyIcon;
var
NotifyIconData: TNotifyIconData;
begin
FillChar(NotifyIconData, SizeOf(NotifyIconData), 0);
with NotifyIconData do
begin
cbSize := SizeOf(NotifyIconData);
Wnd := Handle;
uID := 0;
end;
Shell_NotifyIcon(NIM_DELETE, Addr(NotifyIconData));
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
AddNotifyIcon;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
DeleteNotifyIcon;
end;
procedure TMainForm.WMNotifyIcon(var Msg: TMessage);
var
P: TPoint;
begin
case Msg.lParam of
WM_LBUTTONDOWN,
WM_LBUTTONDBLCLK:
Show;
WM_RBUTTONDOWN:
begin
GetCursorPos(P);
PopupMenu.Popup(P.X, P.Y);
end;
end;
end;
procedure TMainForm.MenuShowClick(Sender: TObject);
begin
Show;
end;
procedure TMainForm.MenuExitClick(Sender: TObject);
begin
Close; // Elég a Close, mert ez a főform.
end;
procedure TMainForm.HideButtonClick(Sender: TObject);
begin
Hide;
end;
------------
Na, ez így működik.
[Szerkesztve] -
emre33
addikt
kicsit közelebb kerültem a megoldáshoz - ha a program indulásakor csak a tálca ikon látható(óra mellett) akkar a leállitás rendben végigmegy, ha a bal klikkel elöhozom a föablakot, akkor megint nem tudja bezárni a progit
a tálca ikon kattintás figyelést a következő rész csinálja:
....
procedure WndProc(var Msg: TMessage); override;
.....
procedure TForm1.WndProc(var Msg: TMessage);
var p : TPoint;
begin
case Msg.LParam of
WM_RBUTTONDOWN : //kattintás az egér jobb gombjával
begin
GetCursorPos(p); //a kurzor pozíciója a kattintáskor
PopupMenu1.Popup(p.x,p.y); //a menü kinyitása
end;
WM_LBUTTONDBLCLK : //bal dupla-kattintás
begin
Form1.Show;
end;
WM_LBUTTONDOWN : //kattintás az egér bal gombjával;
Begin
Form1.Show;
end;
end;
inherited; //a le nem kezelt üzenetek elintéztetése
end;
ha a CloseQuery esemény meghívodik, mert ha hozzárendelem a tálca ikon törtélst akkor az végrehajtódik, ha beirom a ''Application.Terminate;'' sort is, akkor leállításkor be zárja a progit csak nem folytatódik a leállitás folyamata. (most a WM_QUERYENDSESSION nem serepel a programban -
zenit
tag
Mindegy, mit írsz az Msg.Result-ba, mert az inherited miatt a TCustomForm.WMQueryEndSession-je úgyis felülírja neked.
A WM_QUERYENDSESSION-ben elvileg semmilyen Close meg egyéb műveletet nem kellene végrehajtanod, mert utána még úgyis jön egy WM_ENDSESSION, amire az alkalmazás magától kilép.
Ez a Delphi-ben már meg van írva, neked nem is kell vele foglalkoznod.
(Ha van a Formnak CloseQuery-je, akkor ott True-val kell visszatérned, hogy a QueryEndSession is True-val térhessen vissza.)
A DeleteTrayIcon meg egyéb dolgokat a TForm.OnDestroy eseményébe kell raknod. -
emre33
addikt
csináltam egy kis programot dephibe és ha fut a program és le akarom állitani a windowst , akkor a windows be tudja zárni a programot, de a leállitás folyamaa nem folytatódik tovább
Idemásolom a kérdéses részt:
.....
procedure WMQUERYEndSession(var Msg:Tmessage); message WM_QUERYENDSESSION;
.....
procedure TForm1.WMQUERYEndSession(var Msg:TMessage);
begin
// Msg.Result:=1;
Form1.Close;
DeleteTrayIcon;
inherited;
end;
Mi lehet a hiba? Ha adok visszatérésési értéket (Msg.Result:=1;) akkor ugyanugy a program bezáródik , de a kijelentkzés folyamata megszakad !
Aktív témák
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Router gondok
- Óra topik
- Még a saját szövetségeseivel szemben is fegyverként használná az AI-t az USA
- Kerékpárosok, bringások ide!
- Manjaro Linux
- sziku69: Fűzzük össze a szavakat :)
- Kuponkunyeráló
- Hardcore café
- Megtartotta Európában a 7500 mAh-t az Oppo
- További aktív témák...
- ThinkPad T14s Gen 2 i5-1135G7 16GB 512GB FHD 1 év garancia
- Dell Latitude 7320 Core i5-1145 G7, 16GB RAM, SSD, jó akku, számla, 6 hó gar
- 241 - Lenovo Legion 5 (15IRX10) - Intel Core i7-13650HX, RTX 5060
- Apple iPhone 15 Pro Max 256GB,Újszerű,Dobozaval,12 hónap garanciával
- HIBÁTLAN iPhone SE 2020 64GB Black-1 ÉV GARANCIA - Kártyafüggetlen, MS4001
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
