Текущий архив: 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