![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вновь про WM_QUERYENDSESSION + tray
grasshopper © (2006-10-17 13:24:00)Задача - завершить приложение с иконкой в трее при выключении Windows. Стандартный совет - обработать WM_QUERYENDSESSION. Ок, следую совету.
Создаю иконку в трее (средствами API), для обработки сообщений передаю хэндл формы.
procedure TForm1.HookQueryEndSession(var m:TWMQueryEndSession);
begin
inherited;
m.Result:=1;
Application.Terminate;
end;
Результат - приложение завершается, Windows - нет.
Интересен даже не столько рецепт "как побороть" (хотя и это тоже :), сколько - почему вообще возникает необходимость обрабатывать это сообщение? ведь без иконки приложение спокойно завершается и даёт выключиться системе.
Ketmar (2006-10-17 15:28:00) [1]>[11] grasshopper 17-Oct-2006, 15:24
>кто же знал )
этот глюк известен с незапамятных времён. %-))
>разыскал FastNet 5.6
выкинь нафиг. %-) зачем тебе лишние ActiveX? чем не нравятся индейцы? ICS? Synapse?
grasshopper (2006-10-17 15:24:00) [2]Ketmar
> а сразу сказать, что ты используешь это глючище, нельзя
> было?! телепаты в отпуске...
кто же знал ) кстати, разыскал FastNet 5.6 - с ним сабжевого глюка нет.
Rouse_, идея ясна, попробую.
Ketmar (2006-10-17 14:54:00) [3]>[6] grasshopper 17-Oct-2006, 14:15
>Выяснилась любопытная деталь. Когда на форме есть
>компонент ТNMUDP, наблюдается сабж.
а сразу сказать, что ты используешь это глючище, нельзя было?! телепаты в отпуске...
Rouse_ (2006-10-17 14:42:00) [4]Да 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.
grasshopper (2006-10-17 14:27:00) [5]Indy?
Rouse_ (2006-10-17 14:18:00) [6]
> Глюк в FastNet?
Угу, есть такое дело... При чем не только этот компонент из FastNet, там вроде как любой если активен будет - не даст приложению нормально завершиться. Так что переходи на альтернативу.
grasshopper (2006-10-17 14:15:00) [7]Выяснилась любопытная деталь. Когда на форме есть компонент ТNMUDP, наблюдается сабж. Убираю компонент - всё в порядке, программа завершается, винда выключается.
Глюк в FastNet?
Игорь Шевченко (2006-10-17 14:01:00) [8]
> а разве WM_QUERYENDSESSION приходит формам?
Приходит. Но не всем.
Ketmar (2006-10-17 13:43:00) [9]ищи баг. всё должно работать.
по ходу: а разве WM_QUERYENDSESSION приходит формам? вот лень проверять, если честно. но не лучше ли её ловить в форме Application?
clickmaker (2006-10-17 13:38:00) [10]
> Application.Terminate;
а зачем так жестоко?
grasshopper (2006-10-17 13:37:00) [11]Всё руками. Компонентов нет.
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);
Ketmar (2006-10-17 13:29:00) [12]у тебя баг в каком-то другом месте. например, в компоненте, которым ты иконку в трэй пихаешь. выкинь его, и сделай всё руками.