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. 

Спасибо

+0

Значит, вы говорите, что нажатие правой кнопки скрывает главное окно, но нажатие левой кнопки не отображает это окно повторно? –

+0

@RobKennedy Я не могу выполнить ни одну из двух функций. Я нажимаю на значок, но ничего не происходит. – user2952034

+0

@Davidheffernan Я выложу полный код сейчас. как код инициализации, так и код основной формы – user2952034

ответ

1

Вы определили обработчик сообщений, но вы не подключили к к идентификатору сообщения. В объявлении типа формы, изменить TrayMessage декларацию быть:

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

Beyond, что у меня есть следующие замечания:

  1. Всегда проверить функции возвращают значения Win32 ошибок.
  2. Вы пишите Main.Show и Main.Hide в методе TMain. Вы должны просто удалить Main. и вызвать эти методы на неявный объект Self.
  3. Использование побитового or вместо арифметического + для объединения флагов.
  4. Вы используете дескриптор формы для значка уведомления. Если форма будет воссоздана, значок будет потерян. Вместо этого вам нужно использовать стабильный оконный дескриптор, полученный по вызову AllocateHWnd.
+0

Значок подсказки о голубых точках в желобе рядом с обработчиком сообщений был совершенно очевиден, как только я получил это в IDE ...... –

+0

Я получаю сообщение об ошибке Неизвестная директива: «сообщение», когда я пытаюсь скомпилировать следующий код: процедура TrayMessage (var Msg: TMessage); сообщение WM_ICONTRAY; – user2952034

+0

Вы не делаете то, что я сказал. Поместите его в раздел реализации, и на самом деле ваш код говорит: 'procedure TMain.TrayMessage (var Msg: TMessage); сообщение WM_ICONTRAY; '. Вы должны поместить его в объявление типа формы в разделе интерфейса. Кроме того, когда вы вставляете код, вставьте код из своего редактора в строку, которая дает ошибку. ;-) –

Смежные вопросы