I've experienced the same problem with a variety of Tray Icon components.
They evidently don't respond to clicks made on the desktop. But I switched
to the one that comes with Raize components and it does! The solution I
used to use for this problem was to add a "Cancel" menu item to the popup
menu that would allow the user to get rid of it without having to run a
function.
from Robert Meek dba "Tangentals Design"
e-mail: [EMAIL PROTECTED]
Freelance Windows Programming for XP and Vista
Also proud to be a Moderator of the "Delphi-List" at elists.org
"Reality cannot be explained...only enjoyed or endured as your current
perspective allows!"
Hello,
I have a little application that display only a tray icon and a menu.
While it all works well there is something strange. When you right click
then the menu pops up, but you have to click on a menu item to let the
menu dissapear.
Normally if you press <escape> or click somewhere els on the taskbar the
menu should dissapear also.
Any idea wy this behaviour? I copy the wholl code as it is only little.
program Traytest;
uses
Windows, Messages, ShellAPI, Menus, Dialogs, Forms, Registry, SysUtils;
{$R *.RES}
const
ICON_HINT = 'Test tray application';
MyClass = ICON_HINT + '_Class';
WindowName = ICON_HINT + '_WindowName';
WM_CIA_ICONMSG = WM_USER + 1;
type
TPopup = class
private
Menu: TPopupMenu;
QuitTray: TMenuItem;
procedure Popup;
procedure QuitTrayClick(Sender: TObject);
procedure CreateMenu;
procedure DestroyMenu;
public
destructor Destroy; override;
end;
var
WndClass: TWndClass;
HInst: integer;
Handle: integer;
Msg: TMsg;
IconData: TNotifyIconData;
Popup: TPopup;
{ TPopup }
procedure TPopup.CreateMenu;
begin
QuitTray := TMenuItem.Create(nil);
QuitTray.Caption := 'Exit';
QuitTray.OnClick := QuitTrayClick;
Menu := TPopupMenu.Create(nil);
Menu.Items.Add([QuitTray]);
end;
destructor TPopup.Destroy;
begin
DestroyMenu;
inherited;
end;
procedure TPopup.DestroyMenu;
begin
try
QuitTray.Free;
Menu.Free;
except
end;
end;
procedure TPopup.Popup;
var
P: TPoint;
begin
if not Assigned(Menu) then
CreateMenu;
GetCursorPos(P);
Menu.Popup(P.X, P.Y);
Menu.Tag := 0;
end;
procedure TPopup.QuitTrayClick(Sender: TObject);
begin
PostMessage(Handle, WM_QUIT, 0, 0);
end;
function WndProc(HWND, Msg, wParam, lParam: integer): integer; stdcall;
begin
case Msg of
WM_CIA_ICONMSG:
case lParam of
WM_RBUTTONUP:
Popup.Popup;
end;
end;
Result := DefWindowProc(HWND, Msg, wParam, lParam);
end;
begin
HInst := GetModuleHandle(nil);
WndClass.style := 0;
WndClass.lpfnWndproc := @WndProc;
WndClass.hInstance := HInst;
WndClass.hbrBackground := 0;
WndClass.lpszClassName := MyClass;
WndClass.hCursor := 0;
WndClass.hIcon := LoadIcon(hInst, 'MAINICON');
WndClass.lpszMenuName := nil;
WndClass.cbWndExtra := SizeOf(Pointer);
RegisterClass(WndClass);
Handle := CreateWindowEx(WS_EX_TOOLWINDOW, WndClass.lpszClassName,
WindowName, WS_POPUP, 0, 0, 0, 0, 0, 0, HInst, nil);
IconData.cbSize := SizeOf(IconData);
IconData.Wnd := Handle;
IconData.uID := $DEDB;
IconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
IconData.hIcon := LoadIcon(HInst, 'MAINICON');
IconData.uCallbackMessage := WM_CIA_ICONMSG;
CopyMemory(@IconData.szTip, PChar(ICON_HINT), Length(ICON_HINT) + 1);
Shell_NotifyIcon(NIM_ADD, @IconData);
Popup := TPopup.Create;
try
while GetMessage(Msg, 0, 0, 0) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
finally
Shell_NotifyIcon(NIM_DELETE, @IconData);
DestroyWindow(Handle);
Popup.Free;
end;
end.
---
Rgds, Wilfried
http://www.mestdagh.biz
__________________________________________________
Delphi-Talk mailing list -> [email protected]
http://lists.elists.org/cgi-bin/mailman/listinfo/delphi-talk
__________________________________________________
Delphi-Talk mailing list -> [email protected]
http://lists.elists.org/cgi-bin/mailman/listinfo/delphi-talk