Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.25;
Скачать: CL | DM;

Вниз

Вновь про WM_QUERYENDSESSION + tray   Найти похожие ветки 

 
grasshopper   (2006-10-17 13:24) [0]

Задача - завершить приложение с иконкой в трее при выключении Windows. Стандартный совет - обработать WM_QUERYENDSESSION. Ок, следую совету.
Создаю иконку в трее (средствами API), для обработки сообщений передаю хэндл формы.
procedure TForm1.HookQueryEndSession(var m:TWMQueryEndSession);
begin
 inherited;
 m.Result:=1;
 Application.Terminate;
end;

Результат - приложение завершается, Windows - нет.
Интересен даже не столько рецепт "как побороть" (хотя и это тоже :), сколько - почему вообще возникает необходимость обрабатывать это сообщение? ведь без иконки приложение спокойно завершается и даёт выключиться системе.


 
Ketmar ©   (2006-10-17 13:29) [1]

у тебя баг в каком-то другом месте. например, в компоненте, которым ты иконку в трэй пихаешь. выкинь его, и сделай всё руками.


 
grasshopper   (2006-10-17 13:37) [2]

Всё руками. Компонентов нет.

   nid: TNOTIFYICONDATA;
   icon:TIcon;

//...тут загружается icon...
 FillChar(nid,SizeOf(nid),0);
 nid.cbSize:=SizeOf(nid);
 nid.Wnd:=handle;
 nid.uFlags:=NIF_ICON or NIF_MESSAGE;
 nid.uCallbackMessage:=WM_USER;
 nid.hIcon:=icon.Handle;
 Shell_NotifyIcon(NIM_ADD,@nid);


 
clickmaker ©   (2006-10-17 13:38) [3]


> Application.Terminate;

а зачем так жестоко?


 
Ketmar ©   (2006-10-17 13:43) [4]

ищи баг. всё должно работать.

по ходу: а разве WM_QUERYENDSESSION приходит формам? вот лень проверять, если честно. но не лучше ли её ловить в форме Application?


 
Игорь Шевченко ©   (2006-10-17 14:01) [5]


> а разве WM_QUERYENDSESSION приходит формам?


Приходит. Но не всем.


 
grasshopper   (2006-10-17 14:15) [6]

Выяснилась любопытная деталь. Когда на форме есть компонент ТNMUDP, наблюдается сабж. Убираю компонент - всё в порядке, программа завершается, винда выключается.
Глюк в FastNet?


 
Rouse_ ©   (2006-10-17 14:18) [7]


> Глюк в FastNet?

Угу, есть такое дело... При чем не только этот компонент из FastNet, там вроде как любой если активен будет - не даст приложению нормально завершиться. Так что переходи на альтернативу.


 
grasshopper   (2006-10-17 14:27) [8]

Indy?


 
Rouse_ ©   (2006-10-17 14:42) [9]

Да UDP то можно и ручками реализовать :)
Там писанины то на пару десятков строчек, зачем тебе компонент :)

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, Winsock, StdCtrls;

const
 HST_BROADCAST: String = "255.255.255.255";
 MAX_UDP_SIZE: Integer = 8192;
 WM_ASYNC = WM_USER + 1;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 public
   FHandle: HWND;
   procedure SockWND(var AMsg: TMessage); message WM_ASYNC;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 FWSAData: TWSAData;
 FSockAddr: TSockAddrIn;
 FSocket: HWND;
 Option: Boolean;
 Data: String;
begin
 WSAStartup($0101, FWSAData);
 FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 with FSockAddr do
 begin
   sin_addr.S_addr := INADDR_BROADCAST;
   Option := True;
   SetSockOpt(FSocket, SOL_SOCKET, SO_BROADCAST, PChar(@Option), SizeOf(Option));
   sin_port := htons(6767);
   sin_family := AF_INET;
 end;
 Data := "My first broadcast message!!!";
 SendTo(FSocket, Data[1], Length(Data), 0, FSockAddr, SizeOf(FSockAddr));
 closesocket(FSocket);
 WSACleanup;
end;

procedure TForm1.SockWND(var AMsg: TMessage);
var
 Buffer: array [0..8191] of Char;
 Size: Integer;
 SockAddr: TSockAddrIn;
begin
 with AMsg do
   case Msg of
   WM_ASYNC:
   begin
     case WSAGetSelectEvent(LParam) of
       FD_READ:
       begin
         FillChar(Buffer, 8192, #0);
         Size := SizeOf(SockAddr);
         recvfrom(WParam, Buffer[0], MAX_UDP_SIZE, 0, SockAddr, Size);
         ShowMessage(StrPas(@Buffer));
         DeallocateHWnd(FHandle);
         closesocket(WParam);
         WSACleanup;
       end;
     end;
   end
   else
     DefWindowProc(FHandle, Msg, WParam, LParam);
   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 FWSAData: TWSAData;
 FSockAddr: TSockAddrIn;
 FSocket: HWND;
 Option: Boolean;
 Data, SrvHost: String;
begin
 WSAStartup($0101, FWSAData);
 FSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 with FSockAddr do
 begin
   SrvHost := "192.168.2.108"; // Это IP сервака (т.е. нашей машины)
   sin_addr.S_addr := inet_addr(PChar(SrvHost));;
   Option := True;
   SetSockOpt(FSocket, SOL_SOCKET, SO_BROADCAST, PChar(@Option), SizeOf(Option));
   sin_port := htons(6767);
   sin_family := AF_INET;
 end;
 bind(FSocket, FSockAddr, SizeOf(FSockAddr));
 FHandle := AllocateHWnd(SockWND);
 WSAAsyncSelect(FSocket, FHandle, WM_ASYNC, FD_READ);
end;

end.


 
Ketmar ©   (2006-10-17 14:54) [10]

>[6] grasshopper 17-Oct-2006, 14:15
>Выяснилась любопытная деталь. Когда на форме есть
>компонент ТNMUDP, наблюдается сабж.
а сразу сказать, что ты используешь это глючище, нельзя было?! телепаты в отпуске...


 
grasshopper   (2006-10-17 15:24) [11]

Ketmar

> а сразу сказать, что ты используешь это глючище, нельзя
> было?! телепаты в отпуске...

кто же знал ) кстати, разыскал FastNet 5.6 - с ним сабжевого глюка нет.

Rouse_, идея ясна, попробую.


 
Ketmar ©   (2006-10-17 15:28) [12]

>[11] grasshopper 17-Oct-2006, 15:24
>кто же знал )
этот глюк известен с незапамятных времён. %-))

>разыскал FastNet 5.6
выкинь нафиг. %-) зачем тебе лишние ActiveX? чем не нравятся индейцы? ICS? Synapse?



Страницы: 1 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
15-1170403007
Frosja
2007-02-02 10:56
2007.02.25
HELP


2-1170765318
фыфвфы
2007-02-06 15:35
2007.02.25
свойства папки


4-1150218782
Igor Stepanov
2006-06-13 21:13
2007.02.25
Программирование работы с USB-портом


15-1170428522
крек
2007-02-02 18:02
2007.02.25
Спасибо, что подсказали как открыть ps файл!


15-1170501337
DemonP
2007-02-03 14:15
2007.02.25
скрипты JavaScript