2014-01-23 2 views
1

아래 코드를 사용하고 있습니다. 응용 프로그램을 숨기고 싶지만 시스템에서 시도해보십시오 (작동). 그런 다음 왼쪽 마우스를 클릭하여 주 폼을 표시하려고하면 아무 일도 일어나지 않습니다. 도와 주실 래요? 나는 모든 코드를 포함시켰다.Delphi - 응용 프로그램을 열 수없는 시스템 트레이 아이콘

기본 폼 코드 :

unit Main_Unit; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,shellApi,AppEvnts; 



type 
    TMain = class(TForm) 
    Edit1: TEdit; 
    Button1: TButton; 
    Button2: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    TrayIconData: TNotifyIconData; 
    procedure TrayMessage(var Msg: TMessage); 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Main: TMain; 

const 
    WM_ICONTRAY = WM_USER + 1; 

implementation 

{$R *.dfm} 

uses Functions; 

procedure TMain.TrayMessage(var Msg: TMessage); 
begin 
    case Msg.lParam of 
    WM_LBUTTONDOWN: 
    begin 
     ShowMessage('Left button clicked - let''s SHOW the Form!'); 
     Main.Show; 
    end; 
    WM_RBUTTONDOWN: 
    begin 
     ShowMessage('Right button clicked - let''s HIDE the Form!'); 
     Main.Hide; 
    end; 
    end; 
end; 

procedure TMain.FormCreate(Sender: TObject); 
begin 
with TrayIconData do 
    begin 
    cbSize := SizeOf(); 
    Wnd := Handle; 
    uID := 0; 
    uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP; 
    uCallbackMessage := WM_ICONTRAY; 
    hIcon := Application.Icon.Handle; 
    StrPCopy(szTip, Application.Title); 
    end; 
Shell_NotifyIcon(NIM_ADD, @TrayIconData); 
end; 

procedure TMain.FormDestroy(Sender: TObject); 
begin 
Shell_NotifyIcon(NIM_DELETE, @TrayIconData); 
end; 

end. 

초기화 코드 :

program Test; 

uses 
    Vcl.Forms, 
    Main_Unit in 'Main_Unit.pas' {Main}, 
    Functions in 'Functions.pas'; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.ShowMainForm := False; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TMain, Main); 
    Application.Run; 
end. 

당신은 메시지 핸들러를 정의하지만 메시지 ID에 연결하지 않은 당신에게

+0

그래서 오른쪽 버튼을 누르면 기본 창이 숨겨 지지만 왼쪽 버튼을 누르면 해당 창을 다시 표시하지 않는다는 말입니까? –

+0

@RobKennedy 2 가지 기능 중 하나를 실행할 수 없습니다. 나는 아이콘을 클릭하지만 아무 일도 일어나지 않는다. – user2952034

+0

@Davidheffernan 지금 전체 코드를 게시 할 예정입니다. 초기화 코드와 기본 폼 코드 모두 – user2952034

답변

1

감사드립니다. 폼 타입의 선언에서 일하기 위해 TrayMessage 선언을 변경합니다

  1. 항상 오류는 Win32 함수 반환 값을 확인 : 나는 다음과 같은 의견이 그 이상

    procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY; 
    

    합니다.

  2. 방법으로 Main.ShowMain.Hide이라고 쓰십시오. Main.을 제거하고 암시 적 Self 오브젝트에서이 메소드를 호출해야합니다.
  3. flags를 결합하기 위해 + 대신에 or 비트를 사용하십시오.
  4. 알림 아이콘에 양식 핸들을 사용합니다. 양식이 다시 작성되면 아이콘이 고아가됩니다. 대신 AllocateHWnd을 호출하여 얻은 안정된 창 핸들을 사용해야합니다.
+0

IDE에서이 값을 얻으면 메시지 처리기 옆에있는 파란색 점이 표시되지 않습니다. –

+0

오류가 발생했습니다. 알 수없는 지시문 : 'message'다음 코드에서 컴파일하려고합니다. 프로 시저 TrayMessage (var Msg : TMessage); 메시지 WM_ICONTRAY; – user2952034

+0

당신은 내가 한 말을하지 않고 있습니다. 구현 섹션에 넣으면 실제로 코드는 다음과 같이 말합니다 :'procedure TMain.TrayMessage (var Msg : TMessage); 메시지 WM_ICONTRAY;'. 인터페이스 섹션에 양식 유형 선언에 넣어야합니다. 또한 코드를 붙여 넣을 때 오류가 발생한 줄에 편집기의 코드를 붙여 넣으십시오. ;-) –