제 글을 보시니 정말 감사합니다.
다름이 아니라 제목처럼 Tray Icon에서 오른쪽 버튼을 클릭하면 팝업메뉴가 뜹니다.
근데 다른 곳에 클릭하면 팝업메뉴가 사라져야 하는데 사라지지가 않는군요.
제발 조언 좀 부탁드립니다. 아래는 개략적인 소스입니다.
uses
..., ShellApi, ...;
const
WM_MYTRAYICONCALLBACK = WM_USER + 1000;
type
TFormCalcLimit = class(TForm)
Timer: TTimer;
PopupMenu: TPopupMenu;
mnClose: TMenuItem;
.......
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure mnCloseClick(Sender: TObject);
.......
private
{ Private declarations }
MyTrayIcon : TNotifyIconData;
procedure AppMinimize(Sender:TObject);
procedure WMMyTrayIconCallback(var Msg:TMessage);
Message WM_MYTRAYICONCALLBACK;
public
{ Public declarations }
end;
.......
procedure TFormCalcLimit.AppMinimize(Sender:TObject);
begin
Visible := False;
Application.ShowMainForm := Visible;
end;
procedure TFormCalcLimit.WMMyTrayIconCallback(var Msg:TMessage);
var
CursorPos : TPoint;
begin
case Msg.lParam of
WM_RBUTTONDOWN : begin
GetCursorPos(CursorPos);
PopupMenu.Popup(CursorPos.X, CursorPos.Y);
end;
{ WM_LBUTTONDBLCLK : ShowMessage('WM_LBUTTONDBLCLK'); }
{ WM_LBUTTONDOWN : ShowMessage('WM_LBUTTONDOWN'); }
{ WM_LBUTTONUP : ShowMessage('WM_LBUTTONUP'); }
{ WM_MBUTTONDBLCLK : ShowMessage('WM_MBUTTONDBLCLK'); }
{ WM_MBUTTONDOWN : ShowMessage('WM_MBUTTONDOWN'); }
{ WM_MBUTTONUP : ShowMessage('WM_MBUTTONUP'); }
{ WM_MOUSEMOVE : ShowMessage('WM_MOUSEMOVE'); }
{ WM_MOUSEWHEEL : ShowMessage('WM_MOUSEWHEEL'); }
{ WM_RBUTTONDBLCLK : ShowMessage('WM_RBUTTONDBLCLK'); }
{ WM_RBUTTONUP : ShowMessage('WM_RBUTTONUP'); }
end;
end;
procedure TFormCalcLimit.FormCreate(Sender: TObject);
begin
Application.OnMinimize := AppMinimize;
Application.ShowMainForm := Visible;
with MyTrayIcon do begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Handle;
uId := 1;
uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;
uCallBackMessage := WM_MYTRAYICONCALLBACK;
hIcon := LoadIcon(0, IDI_APPLICATION);
szTip := 'Calculating up and down limit...';
end;
Shell_NotifyIcon(NIM_ADD, @MyTrayIcon);
end;
procedure TFormCalcLimit.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @MyTrayIcon);
end;
procedure TFormCalcLimit.mnCloseClick(Sender: TObject);
begin
Close;
end;
답변을 하면....
setForegroundWindow( Application.handle)을
PopupMenu.Popup(CursorPos.X, CursorPos.Y)의 위치중
아래 위로 붙이시면 됩니다.
즉,
setForegroundWindow( Application.handle);
PopupMenu.Popup(CursorPos.X, CursorPos.Y);
setForegroundWindow( Application.handle);
이렇게 요...
다른 핸들 값만 처리하는 부분만 만들면 굳이 컴포넌트를 쓰시지 않아도 됩니다.
그럼 1년이 넘은 글에 답변을 하며..
장지용 wrote:
> 제 글을 보시니 정말 감사합니다.
> 다름이 아니라 제목처럼 Tray Icon에서 오른쪽 버튼을 클릭하면 팝업메뉴가 뜹니다.
> 근데 다른 곳에 클릭하면 팝업메뉴가 사라져야 하는데 사라지지가 않는군요.
>
> 제발 조언 좀 부탁드립니다. 아래는 개략적인 소스입니다.
>
> uses
> ..., ShellApi, ...;
>
> const
> WM_MYTRAYICONCALLBACK = WM_USER + 1000;
>
> type
> TFormCalcLimit = class(TForm)
> Timer: TTimer;
> PopupMenu: TPopupMenu;
> mnClose: TMenuItem;
> .......
>
> procedure FormCreate(Sender: TObject);
> procedure FormDestroy(Sender: TObject);
> procedure mnCloseClick(Sender: TObject);
> .......
> private
> { Private declarations }
> MyTrayIcon : TNotifyIconData;
>
> procedure AppMinimize(Sender:TObject);
> procedure WMMyTrayIconCallback(var Msg:TMessage);
>
> Message WM_MYTRAYICONCALLBACK;
> public
> { Public declarations }
> end;
>
> .......
> procedure TFormCalcLimit.AppMinimize(Sender:TObject);
> begin
> Visible := False;
> Application.ShowMainForm := Visible;
> end;
>
> procedure TFormCalcLimit.WMMyTrayIconCallback(var Msg:TMessage);
> var
> CursorPos : TPoint;
> begin
> case Msg.lParam of
> WM_RBUTTONDOWN : begin
> GetCursorPos(CursorPos);
> PopupMenu.Popup(CursorPos.X, CursorPos.Y);
> end;
> { WM_LBUTTONDBLCLK : ShowMessage('WM_LBUTTONDBLCLK'); }
> { WM_LBUTTONDOWN : ShowMessage('WM_LBUTTONDOWN'); }
> { WM_LBUTTONUP : ShowMessage('WM_LBUTTONUP'); }
> { WM_MBUTTONDBLCLK : ShowMessage('WM_MBUTTONDBLCLK'); }
> { WM_MBUTTONDOWN : ShowMessage('WM_MBUTTONDOWN'); }
> { WM_MBUTTONUP : ShowMessage('WM_MBUTTONUP'); }
> { WM_MOUSEMOVE : ShowMessage('WM_MOUSEMOVE'); }
> { WM_MOUSEWHEEL : ShowMessage('WM_MOUSEWHEEL'); }
> { WM_RBUTTONDBLCLK : ShowMessage('WM_RBUTTONDBLCLK'); }
> { WM_RBUTTONUP : ShowMessage('WM_RBUTTONUP'); }
> end;
> end;
>
> procedure TFormCalcLimit.FormCreate(Sender: TObject);
> begin
> Application.OnMinimize := AppMinimize;
> Application.ShowMainForm := Visible;
>
> with MyTrayIcon do begin
> cbSize := SizeOf(TNotifyIconData);
> Wnd := Handle;
> uId := 1;
> uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;
> uCallBackMessage := WM_MYTRAYICONCALLBACK;
> hIcon := LoadIcon(0, IDI_APPLICATION);
> szTip := 'Calculating up and down limit...';
> end;
>
> Shell_NotifyIcon(NIM_ADD, @MyTrayIcon);
> end;
>
> procedure TFormCalcLimit.FormDestroy(Sender: TObject);
> begin
> Shell_NotifyIcon(NIM_DELETE, @MyTrayIcon);
> end;
>
>
> procedure TFormCalcLimit.mnCloseClick(Sender: TObject);
> begin
> Close;
> end;
>
>
>