Q&A

  • Tray Icon 팝업 후 다른 곳 클릭하면 팝업메뉴가 없어져야 되는데...
제 글을 보시니 정말 감사합니다.

다름이 아니라 제목처럼 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;







2  COMMENTS
  • Profile
    nemesis 2001.11.08 07:46
    1년이 넘은 글인데

    답변을 하면....

    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;

    >

    >

    >

  • Profile
    톰과 제리 2000.04.26 08:29
    Rx라이브러리에 있는 RxTray를 사용하면 간단하게 할수 있는것 같던데요.

    힘들게 코딩할 필요가 있겠습니까.





    장지용 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;

    >

    >

    >