Главная страница
    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.48 MB
Время: 0.046 c
2-1170504835
Garacio
2007-02-03 15:13
2007.02.25
Архивирование


2-1170858625
C@N
2007-02-07 17:30
2007.02.25
Старый добрый DOS...


2-1170596520
Max.66RUS
2007-02-04 16:42
2007.02.25
Как присвоить к .ЕХЕ файлу иконку...?


15-1170460185
hmmm
2007-02-03 02:49
2007.02.25
заливка файла на сервер


15-1167466599
vidiv
2006-12-30 11:16
2007.02.25
base64, "+" и HTTP POST





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский