Aktív témák

  • 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 !


    ASUS B650E-E, AMD Ryzen 9 7900, CORSAIR 64GB DDR5 6000MHz CL30 KIT CMK64GX5M2B6000Z30, ARCTIC COOLING Liquid Freezer II 360

  • zenit

    tag

    válasz emre33 #1 üzenetére

    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

    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

    ASUS B650E-E, AMD Ryzen 9 7900, CORSAIR 64GB DDR5 6000MHz CL30 KIT CMK64GX5M2B6000Z30, ARCTIC COOLING Liquid Freezer II 360

  • zenit

    tag

    válasz emre33 #3 üzenetére

    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

    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 ?

    ASUS B650E-E, AMD Ryzen 9 7900, CORSAIR 64GB DDR5 6000MHz CL30 KIT CMK64GX5M2B6000Z30, ARCTIC COOLING Liquid Freezer II 360

  • zenit

    tag

    válasz emre33 #5 üzenetére

    Akkor az sajnos a komponens hibája, nem (jól) kezeli le a WM_QUERYENDSESSION üzenetet. :(
    Nem tudsz vele mit csinálni, talán keressél belőle újabb verziót, vagy használj inkább Indy-t (ingyenes).

  • emre33

    addikt

    válasz zenit #6 üzenetére

    ok, megprobálom

    kössszi

    [Szerkesztve]

    ASUS B650E-E, AMD Ryzen 9 7900, CORSAIR 64GB DDR5 6000MHz CL30 KIT CMK64GX5M2B6000Z30, ARCTIC COOLING Liquid Freezer II 360

Aktív témák