Keresés

Aktív témák

  • 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).

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

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

Aktív témák