Code:

void __fastcall CreateParams(TCreateParams &Params);

 

...

 

void __fastcall TForm1::CreateParams(TCreateParams &Params)

{

TForm::CreateParams(Params);

Params.ExStyle |= WS_EX_APPWINDOW;

Params.WndParent = GetDesktopWindow();

}

 

 

 

Code:

// Это необходимо объявить в секции public в верхней части вашего pas-файла

procedure TForm1.IconCallBackMessage( var Mess : TMessage ); message WM_USER + 100;

  

procedure TForm1.FormCreate(Sender: TObject);

var

 

nid: TNotifyIconData;

begin

 

with nid do

begin

   cbSize := SizeOf(TNotifyIconData);

   Wnd := Form1.Handle;

   uID := 1;

   uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;

   uCallbackMessage := WM_USER + 100;

   hIcon := Application.Icon.Handle;

   szTip := 'Текст всплывающей подсказки';

end;

Shell_NotifyIcon(NIM_ADD, @nid);

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

var

 

nid: TNotifyIconData;

begin

 

with nid do

begin

   cbSize := SizeOf(TNotifyIconData);

   Wnd := Form1.Handle;

   uID := 1;

   uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;

   uCallbackMessage := WM_USER + 100;

   hIcon := Application.Icon.Handle;

   szTip := 'Текст всплывающей подсказки';

   // Все, что указано выше, не является обязательным

 

end;

Shell_NotifyIcon(NIM_DELETE, @nid);

end;

 

procedure TForm1.IconCallBackMessage(var Mess: TMessage);

var

 

sEventLog: string;

begin

 

case Mess.lParam of

   // Сделайте здесь все что вы хотите. Например,

   // вызов контекстного меню при нажатии правой кнопки мыши.

 

   WM_LBUTTONDBLCLK: sEventLog := 'Двойной щелчок левой кнопкой';

   WM_LBUTTONDOWN: sEventLog := 'Нажатие левой кнопки мыши';

   WM_LBUTTONUP: sEventLog := 'Отжатие левой кнопки мыши';

   WM_MBUTTONDBLCLK: sEventLog := 'Двойной щелчок мышью';

   WM_MBUTTONDOWN: sEventLog := 'Нажатие кнопки мыши';

   WM_MBUTTONUP: sEventLog := 'Отжатие кнопки мыши';

   WM_MOUSEMOVE: sEventLog := 'перемещение мыши';

   WM_MOUSEWHEEL: sEventLog := 'Вращение колесика мыши';

   WM_RBUTTONDBLCLK: sEventLog := 'Двойной щелчок правой кнопкой';

   WM_RBUTTONDOWN: sEventLog := 'Нажатие правой кнопки мыши';

   WM_RBUTTONUP: sEventLog := 'Отжатие правой кнопки мыши';

end;

end;

 

 

 

Итак, если Вам надоело привычное статическое изображение кнопки "Пуск", то предлагаю немного оживить её :) Надеюсь, что это доставит Вам удовольствие.

 

Code:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

FlashWindow(Application.Handle, True);

end;

 

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

begin

  MoveWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil),

             300, 0, 80, 22, true);

end;

 

 

Code:

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.

 

 

Для начала создайте какой-нибудь Bitmap, который вы будете натягивать на кнопку [т.к. такого понятия как "заголовок кнопки ПУСК" в действительности не существует], а та надпись, что находится на стартовой кнопке, является рисунком. Создавая рисунок, учитывайте размеры и то, что левая сторона должна быть "плоской", как у нас на рисунке слева, это связано с особенностями наложения.

 

В этой статье я хотел бы описать полезную недокументированную  функцию GetTaskmanWindow. Функция GetTaskmanWindow возвращает дескриптор

окна, которое владеет кнопками панели задач. Вот цитата о панели задач из Microsoft MSDN:  "Программа Microsoft® для Windows® интерфейс, включающий приложение

панель называется панелью задач. Панель задач может использоваться для выполнения таких задач, как переключение между открытыми Windows и запуск новых приложений..." и "панель задач содержит меню Пуск, кнопки панели задач,  контекстное меню и панель состояния...". К сожалению, Win32 API не содержит документированных функций, которые могут быть использованы для доступа к задач, поэтому мы должны снова использовать недокументированный способ.

 

Пример из серии "Что можно сделать с рабочим столом". В общем, это обычный трюк с кнопкой "Пуск" (Start).

 

Есть ли у кого пример рисования на иконке минимизированного приложения с помощью Delphi?

 Когда Delphi-приложение минимизировано, иконка, которая вы видите - реальное главное окно, объект TApplication, поэтому вам необходимо использовать переменную Application. Таким образом, чтобы удостовериться что приложение минимизировано, вызовите IsIconic(Application.Handle). Если функция возвратит True, значит так оно и есть. Для рисования на иконке создайте обработчик события Application.OnMessage. Здесь вы можете проверять наличие сообщения WM_Paint и при его нахождении отрисовывать иконку. Это должно выглядеть приблизительно так:

 

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

begin

SendMessage(Self.Handle, WM_SYSCOMMAND, SC_TASKLIST, 0);

end;