Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Показать контекстное меню на панели задач

Delphi , Рабочий стол , TaskBar

Показать контекстное меню на панели задач

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch


(*
   (Vorbemerkung zu "TNA": damit ist der "Task Notification Area" gemeint.)

   Ein Symbol im TNA zu erzeugen -> kein Problem
   Ein Popupmenu beim Klick auf dieses Symbol anzuzeigen -> kein Problem
   AAABER dieses auch wieder verschwinden zu lassen wenn der Klick irgendwo anders
   erfolgt -> eine Katastrophe ... jedenfalls bis mir die Idee kam ... siehe unten
   die mit "ACHTUNG!!!" gekennzeichnete Zeile
 *)


 unit TNA;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Controls, Forms, ExtCtrls,
   ShellApi, Menus;

 const
   k_WM_TASKMSG = WM_APP + 100;  //die "100" ist ein frei wahlbarer Wert 

type
   TForm1 = class(TForm)
     TPopupMenu1: TPopupMenu;
     procedure FormCreate(Sender: TObject);
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
     procedure FormDblClick(Sender: TObject);
     procedure PopupMenuClick(Sender: TObject);
   private
     { Private-Deklarationen }
     tTNA: TNotifyIconData;

     procedure WMTaskMsg(var Msg: TMessage); message k_WM_TASKMSG;
     procedure AppActive;
     procedure AppDeactivate;
     procedure ShowIcon;
     procedure ChangeIcon;

   public
     { Public-Deklarationen }
   end;

 var
   Form1: TForm1;


 implementation


 {$R *.DFM}
 {$R TNA.RES} //eine Resource mit 2 Icons oder Bitmaps 


procedure TForm1.FormCreate(Sender: TObject);
 begin
   {la?t die Form schon bei Programmstart verschwinden}
   Application.ShowMainForm := False;

   {Symbol im TNA anzeigen}
   Self.ShowIcon;
 end;


 procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
   {Symbol aus dem TNA entfernen}
   Shell_NotifyIcon(NIM_DELETE, @tTNA);
 end;


 procedure TForm1.FormDblClick(Sender: TObject);
 begin
   {lassen wir doch die Form wieder verschwinden ...}
   Self.AppDeactivate;

   {... und andern das Symbol in dem TNA}
   Self.ChangeIcon;
 end;


 procedure TForm1.PopupMenuClick(Sender: TObject);
 begin
   case TPopupMenu(Sender).Tag of

     {hier steht dann die Auswahl was getan werden soll}
     {wenn auf das erschienene Popupmenu geklickt wurde}
   end;
 end;


 procedure TForm1.WMTaskMsg(var Msg: TMessage);
 var
   rCursor: TPoint;
 begin
   {wenn die Nachricht aus unserem definierten Bereich kommt dann ...}
   if Msg.wParam = tTNA.uID then
   begin
     {... tu was wenn das Ereignis ein ...}
     case Msg.lParam of

       {... rechter Mausklick ist oder ...}
       WM_RBUTTONDOWN:
         begin
           {aktuelle Cursoposition holen}
           GetCursorPos(rCursor);

           {ACHTUNG!!!!! Der folgende Aufruf ist an dieser Stelle ganz wichtig!!!!}
 {Erst durch diese API-Funktion wird das Popupmenu dazu bewegt zu verschwinden 
wenn ein Klick au?erhalb des Popupmenus erfolgt}

           SetForegroundWindow(Self.Handle);

           {Also, nicht vergessen!!!}


           {Das Popupmenu erscheint an der gewunschten Position in dem TNA}
           TPopupMenu1.Popup(rCursor.x, rCursor.y);
         end;

       {... ein linker doppelter Mausklick ist}
       WM_LBUTTONDBLCLK: Self.AppActive;
     end;
   end;
 end;


 procedure TForm1.AppActive;
 var
   hOwner: THandle;
 begin
   {Form einblenden}
   SendMessage(Self.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
   ShowWindow(Self.Handle, SW_SHOW);
   SetForegroundWindow(Self.Handle);

   {Symbol in der Taskbar einblenden}
   hOwner := GetWindow(Self.Handle, GW_OWNER);
   SendMessage(hOwner, WM_SYSCOMMAND, SC_RESTORE, 0);
   ShowWindow(hOwner, SW_SHOW);
 end;


 procedure TForm1.AppDeactivate;
 begin
   {Form ausblenden}
   ShowWindow(Self.Handle, SW_HIDE);

   {Symbol in der Taskbar ausblenden}
   ShowWindow(GetWindow(Self.Handle, GW_OWNER), SW_HIDE);
 end;


 procedure TForm1.ShowIcon;
 begin
   tTNA.cbSize := SizeOf(tTNA);
   tTNA.Wnd    := Self.Handle;
   tTNA.uID    := 24112000;                     //frei wahlbarer Wert zur Identifizierung 
  tTNA.uCallbackMessage := k_WM_TASKMSG;
   tTNA.hIcon  := LoadIcon(hInstance, 'xxx');
   //xxx ist die Bezeichnung eines Icons aus "TNA.res" 
  StrCopy(tTNA.szTip, 'Hallo');             //Hint 
  tTNA.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
   {CB Symbol in dem TNA einrichten CE}
   Shell_NotifyIcon(NIM_ADD, @tTNA);
 end;


 procedure TForm1.ChangeIcon;
 begin
   tTNA.cbSize := SizeOf(tTNA);
   tTNA.hIcon  := LoadIcon(hInstance, 'yyy');
   //yyy ist die Bezeichnung eines weiteren Icons aus "TNA.res" 
  StrCopy(tTNA.szTip, 'Welt');              //Hint 

  {CB Symbol im TNA andern CE}
   Shell_NotifyIcon(NIM_MODIFY, @tTNA);
 end;


 end.

Перевод контента на русский язык:

Код, который вы предоставили, это приложение Delphi, создаваемое для создания иконки уведомления в панели задач и отображения всплывающего меню, когда пользователь кликает по ней. Всплывающее меню исчезает, когда пользователь кликает вне его.

Вот разбивка кода:

  1. Единица TNA определяет интерфейс для создания иконки уведомления.
  2. Класс TForm1 наследуется от TForm и содержит методы для создания, закрытия, двойного клика и обработки кликов по всплывающему меню.
  3. В методе FormCreate, основное окно формы скрывается, а иконка уведомления отображается в панели задач с помощью процедуры ShowIcon.
  4. Метод FormClose удаляет иконку уведомления из панели задач при закрытии приложения.
  5. Метод FormDblClick скрывает форму и изменяет иконку уведомления, когда пользователь дважды кликает по ней.
  6. Метод PopupMenuClick обрабатывает клики по всплывающему меню, но в этом случае он пустой, потому что код отсутствует для обработки различных выборов пунктов меню.
  7. Процедура WMTaskMsg обрабатывает сообщения, отправленные иконкой уведомления. Она проверяет, является ли сообщение от иконки уведомления, и затем отображает или скрывает форму соответственно.
  8. Методы AppActive и AppDeactivate отображают форму при активации и скрывают ее при деактивации.

Некоторые улучшения, которые можно сделать в этом коде, включают:

  1. Удаление повторяющегося кода: есть некоторые повторяющиеся строки кода в процедурах ShowIcon и ChangeIcon.
  2. Улучшение производительности: процедура SetForegroundWindow может замедлить приложение. Могло быть лучше использовать другой метод для отображения или скрытия формы.
  3. Обработка ошибок: код не обрабатывает потенциальные ошибки, которые могут возникнуть при создании, отображении или закрытии иконки уведомления.

Вот альтернативное решение с использованием встроенного компонента TNotifyIcon Delphi:

  1. Создайте новую форму и добавьте к ней компонент TNotifyIcon.
  2. Установите свойства cbSize, Wnd, uID, uCallbackMessage, hIcon и szTip уведомления.
  3. В событии OnActivate формы отображайте форму при активации.
  4. В событии OnDeactivate формы скрывайте форму при деактивации.
  5. В событии OnClick формы обрабатывайте клики по всплывающему меню, отображая или скрывая форму.

Вот пример кода:

type
  TForm1 = class(TForm)
    NotifyIcon1: TNotifyIcon;
    procedure FormActivate(Sender: TObject);
    procedure FormDeactivate(Sender: TObject);
    procedure NotifyIconClick(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

procedure TForm1.FormActivate(Sender: TObject);
begin
  Show;
end;

procedure TForm1.FormDeactivate(Sender: TObject);
begin
  Hide;
end;

procedure TForm1.NotifyIconClick(Sender: TObject);
begin
  if Sender = NotifyIcon1 then
    // Обрабатывайте клики по всплывающему меню здесь
  end;
end;

initialization
  with Form1 do
  begin
    Caption := 'Notification Icon';
    NotifyIcon1.cbSize := SizeOf(NotifyIconData);
    NotifyIcon1.Wnd := Self.Handle;
    NotifyIcon1.uID := 24112000;
    NotifyIcon1.uCallbackMessage := WM_TASKMSG;
    NotifyIcon1.hIcon := LoadIcon(HInstance, 'xxx');
    NotifyIcon1.szTip := 'Hallo';
    NotifyIcon1.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  end;
end.

Обратите внимание, что это только начальный код и может потребоваться модификация для соответствия вашим конкретным требованиям.

Показать контекстное меню на панели задач позволяет создавать и управлять контекстным меню на панели задачи Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TaskBar ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-08-20 15:01:00/0.0038368701934814/0