Hej.. Löste det med lite subclassning. Ta bort systrayikon via min komponent
Jag håller på med en komponent som ska lägga till en icon i systray och sånt.
Och har lyckats att lägga till en icon via min komponent.
Nu vill jag ta bort den när man klickar på den, vilket jag inte får till.
min senaste kod är:
<code>
unit sysIcong;
interface
uses
Windows, Messages, SysUtils, Classes,ShellApi,Menus;
const WM_ICONTRAY = WM_USER + 1;
type
TsysIcong = class(Tcomponent)
private
TrayIcon : TNotifyIconData;
popup1:TPopupMenu;
procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
protected
public
procedure Add(icon: HICON;tooltiptext:string;hwnd:Thandle;popupmeny:TPopupMenu);
published
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('bjs', [TsysIcong]);
end;
{ TsysIcong }
procedure TsysIcong.Add(icon: HICON; tooltiptext:string;hwnd:Thandle;popupmeny:TPopupMenu);
begin
//...
end;
procedure TsysIcong.TrayMessage(var Msg: TMessage);
begin
case Msg.lParam of
WM_LBUTTONDOWN:
begin
Shell_NotifyIcon(NIM_DELETE,@TrayIcon);
end;
end;
end;
end.
</code>
förstår inte riktigt varför den inte vill funka...=/
/bjSv: Ta bort systrayikon via min komponent
och med hjälp från ett annat forum...
problemet var att Form1 aldrig fick tag i händelsen vilket gjorde att man var tvugen att subclass..
All min kod:
<code>
unit sysIcong;
interface
uses
Windows, Messages, SysUtils, Classes,ShellApi,Menus,Graphics;
const WM_ICONTRAY = WM_USER + 1;
type
TsysIcong = class(Tcomponent)
private
TrayIcon : TNotifyIconData;
popup1:TPopupMenu;
NewWndProc,OldWndProc:pointer;
sHwnd:Thandle;
protected
public
procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
procedure Add(icon: HICON;tooltiptext:string;hwnd:Thandle;popupmeny:TPopupMenu);
published
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('bjs', [TsysIcong]);
end;
{ TsysIcong }
procedure TsysIcong.Add(icon: HICON; tooltiptext:string;hwnd:Thandle;popupmeny:TPopupMenu);
begin
NewWndProc := MakeObjectInstance(TrayMessage);
OldWndProc := Pointer(SetWindowLong(hwnd, GWL_WndProc, Integer(NewWndProc)));
Trayicon.cbSize := SizeOf(TNotifyIconData);
Trayicon.Wnd := hwnd;
StrLCopy(Trayicon.szTip, PChar(tooltiptext), 64);
Trayicon.uID := 1;
TrayIcon.hIcon := icon;
TrayIcon.uCallbackMessage := WM_ICONTRAY;
Trayicon.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,@trayicon);
popup1 := popupmeny;
shwnd := hwnd;
end;
procedure TsysIcong.TrayMessage(var Msg: TMessage);
begin
case Msg.lParam of
WM_LBUTTONDOWN:
begin
Shell_NotifyIcon(NIM_DELETE,@TrayIcon);
end;
end;
Msg.Result := CallWindowProc(OldWndProc,
sHwnd, Msg.Msg, Msg.WParam, Msg.LParam);
end;
end.
</code>