Q&A

  • 트레이 아이콘 관련 질문입니다.
현재 CoolTrayIcon 콤포를 사용하여
트레이 아이콘에 팝업을 설치했는데요

마우스 오른쪽 버튼을 눌러서 클릭하면 저의 프로그램에서 나오는 팝업과

트레이 빈공간에 클릭했을때의 윈도우 속성 팝업이 동시에 같이 뜨는데

윈도우 속성과 저의 팝업이 같이 뜨는것을 막을 수 있나요?

윈도우 속성창이 안나오고 저의 프로그램 팝업만 뜨게 하고 싶습니다.
3  COMMENTS
  • Profile
    황성욱 2007.11.09 20:52
    CoolTray가 Mouse Down Event에서 Popup메뉴를 보여주어서 그런 현상이 발생한다고 합니다.
    CoolTrayIcon.Pas 에서 WM_RBUTTONDOWN에서 해당부분 주석 처리 하시고 WM_RBUTTONUP에 추가해주시면 될겁니다.
    <!--CodeS-->
    WM_RBUTTONDOWN:
              if FEnabled then
              begin
                Shift := ShiftState + [ssRight];
                GetCursorPos(Pt);
                MouseDown(mbRight, Shift, Pt.x, Pt.y);
                //주석처리 시작
                {if (Assigned(FPopupMenu)) and (FPopupMenu.AutoPopup) then
                begin
                  SetForegroundWindow(TrayIconHandler.FHandle);    // So menu closes when used in a DLL
                  PopupAtCursor;
                end;}
                //주석처리 끝
              end;

    WM_RBUTTONUP:
              if FBehavior = bhWin95 then
                if FEnabled then
                begin
                  Shift := ShiftState + [ssRight];
                  GetCursorPos(Pt);
                  MouseUp(mbRight, Shift, Pt.x, Pt.y);
                  //수정 시작 WM_RBUTTONDOWN 이벤트에서 복사해옴
                  if (Assigned(FPopupMenu)) and (FPopupMenu.AutoPopup) then
                  begin
                    SetForegroundWindow(TrayIconHandler.FHandle);    // So menu closes when used in a DLL
                    PopupAtCursor;
                  end;
                  //수정 끝
                end;
    <!--CodeE-->

  • Profile
    구창민 2007.10.04 20:43
    안녕하세요..

    간단히 프로그래밍 가능한 부분은 써드파티 컴포넌트를 사용하기 보다

    코드로 작성해두시는것이 추후 유지보수에도 유연히 대처하실 수 있습니다..

    아래 트레이 아이콘을 사용하는 예제소스를 참고하세요...

    그럼.. 항상 즐거운 프로그래밍 하시구요..

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Menus, ShellApi;

    type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure N1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure WndProc(var Message: TMessage); override;
        procedure MinimizeHandler(Sender: TObject);
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}
      const MY_SHOWFORM_ID = WM_USER+1;  //<--- 사용자 정의 메세지


    procedure TForm1.MinimizeHandler(Sender: TObject);
    begin
      ShowWindow(Application.Handle, SW_HIDE);  //최소화 될때 화면과 태스크바에서 사라지게 합니다.
    end;


    procedure TForm1.WndProc;
    var pt : Tpoint;
    begin
        case Message.Msg of
          MY_SHOWFORM_ID:
            case Message.lParam of
              WM_LBUTTONDBLCLK: //트레이 아이콘 좌클릭
                                begin  
                                  ShowWindow(Application.Handle,SW_SHOWNORMAL);
                                  Self.Show;
                                  SetForegroundWindow(Form1.Handle);
                                end;
              wm_rbuttondown: //트레이 아이콘 우클릭
                               begin  
                                 GetcursorPos(pt);
                                 SetForegroundWindow(Handle);
                                 PopupMenu1.Popup(pt.x,pt.y);//<-- 사용자 정의 PopUpMenu popup.
                               end;
            end;
        end;
        inherited;
    end;

    //트레이 아이콘 생성
    procedure TForm1.FormCreate(Sender: TObject);
    var
        iconData    : TNotifyIconData;
    begin
      ShowWindow (Application.Handle, SW_HIDE);
      Application.ShowMainForm:= False;
      with IconData do
      begin
        cbSize           := SizeOf ( IconData );
        Wnd              := Handle;
        uID              := 100;
        uFlags           := NIF_MESSAGE + NIF_ICON + NIF_TIP;
        uCallbackMessage := WM_USER + 1;
        hIcon            := Application.Icon.Handle;
        StrPCopy(szTip, Application.Title);
      end;
      Shell_NotifyIcon( NIM_ADD, @IconData );
      Application.OnMinimize := MinimizeHandler;    //<--- MainForm의  최소화 메시지 핸들러 재정의

    end;

    //트레이 아이콘 소멸
    procedure TForm1.FormDestroy(Sender: TObject);
    var  iconData    : TNotifyIconData;
    begin
      with IconData do
      begin
        cbSize           := SizeOf ( IconData );
        Wnd              := Handle;
        uID              := 100;
        uFlags           := NIF_MESSAGE + NIF_ICON + NIF_TIP;
        uCallbackMessage := WM_USER + 1;
        hIcon            := Application.Icon.Handle;
        StrPCopy(szTip, Application.Title);
      end;
      Shell_NotifyIcon(NIM_DELETE, @IconData );  //<--- 트레이 아이콘의 소멸
    end;

    //팝업메뉴의 '열기'
    procedure TForm1.N1Click(Sender: TObject);
    begin
      ShowWindow(Application.Handle,SW_SHOWNORMAL);
      Self.Show;
      SetForegroundWindow(Form1.Handle);
    end;

    end.






  • Profile
    늙은래머 2008.05.19 03:42
    ..