제 글을 보시니 정말 감사합니다.
다름이 아니라 제목처럼 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;
>
>
>