トレイアイコン


タスクバーの右の方に小さなアイコンを表示させるには、Win32 APIを使う必要があります(~Delphi5)。使うAPI関数はShell_NotifyIconという関数ですが、この関数はWindowsパッケージでサポートされていません。よってこの関数が使えるようにプログラマが関数宣言を行う必要があります。

 

 API関数の宣言

一般的にWin32 API関数を使うときには宣言が必要です。ただし、Windowsパッケージをuses節に含めておくと、大多数のよく使うAPI関数の宣言をプログラマが行う必要がなくなります。API関数はC言語で書かれているため、C言語からObject Pascalに翻訳する必要があります。C言語でのAPI関数の宣言は、C言語のヘッダファイルから検索するか、MSDNライブラリCD-ROMなどで調べる必要があります。

API関数の本体はKernel32.dll, User32.dll, Shell32.dllなどのシステムファイルに含まれていて、呼び出し規約はstdcallです。よって、次の様に宣言します(Shell_NotifyIconの場合)。

function Shell_NotifyIcon(dwMessage: LongWord; pnid: PNOTIFYICONDATA): LongBool; stdcall; external 'Shell32.dll' name 'Shell_NotifyIconA';

external 'Shell32.dll'は、この関数がShell32.dllに含まれていることを示しています。どのシステムファイルに含まれるかはMSDNライブラリCD-ROMなどで調べる必要があります。name 'Shell_NotifyIconA'はANSIバージョンのShell_NotifyIcon関数を使うことを指示しています(この部分は必須ではありません)。ふつう、API関数にはANSIバージョンとUnicodeバージョンがありますが、Windows9xでは意識する必要はありません。

 

 トレイにアイコンを追加するには

Shell_NotifyIcon関数は、上の宣言からわかるように2つの引数をとります。1つめがコマンドコードで

NIM_ADD
NIM_DELETE
NIM_MODIFY

などを指定できます。トレイにアイコンを追加する場合は、NIM_ADDを使います。2つめの引数がNOTIFYICONDATA型のポインタです。このレコード型で細かな設定を行います。このレコード型の内容はサンプルを参照してください。関数の呼び出しの準備ができたら、Shell_NotifyIconを呼び出します。呼び出しが成功すると、LongBool型のtrueが返されます。

 サンプル

{ アイコントレイの使用サンプル }
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ImgList, StdCtrls;

const
	// このような値はwindows.hなどから文字列を検索して取得
	NIM_ADD =    0;
    NIM_MODIFY = 1;
    NIM_DELETE = 2;

    NIF_MESSAGE = 1;
    NIF_ICON =    2;
    NIF_TIP =     4;

type
  // Win32ヘルプなどのC構造体を読み替える
  NOTIFYICONDATA = record
    cbSize: Longint;   // レコードのサイズを設定
    hWnd: Integer;     // ウィンドウハンドル
    uID: LongWord;     // ユーザが利用可能
    uFlags: LongWord;  // 各種のフラグを設定
    uCallbackMessage: LongWord;  // アイコンがクリックされたときのコールバック関数
    hIcon: Integer;  // アイコンハンドル
    szTip: array[0..63] of Char;   // ツールチップテキスト
  end;

  PNOTIFYICONDATA = ^NOTIFYICONDATA;

  TForm1 = class(TForm)
    ImageList1: TImageList;
    Label1: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    FIconData: NOTIFYICONDATA;
  public
    { Public 宣言 }

  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ Shell_NotifyIcon API関数の宣言 : C言語の宣言を読み替える }
function Shell_NotifyIcon(dwMessage: LongWord; pnid: PNOTIFYICONDATA): LongBool; stdcall; external 'Shell32.dll' name 'Shell_NotifyIconA';


procedure TForm1.FormCreate(Sender: TObject);
var
	Icon1: TIcon;
begin
	FIconData.cbSize := SizeOf(FIconData);
    FIconData.hWnd := Handle;
	// フォーム上のImageListコントロールでアイコンをロードしておく
    ImageList1.GetIcon(0, Icon1);   // ImageListの0番目のアイコン
    FIconData.hIcon := Icon1.Handle;    // アイコンハンドルを得る
    FIconData.uCallbackMessage := 0;
    FIconData.uFlags := NIF_ICON or NIF_TIP;
    FIconData.uID := 0;
    StrPCopy(FIconData.szTip, 'Test');
	// アイコンをトレイに追加
	Shell_NotifyIcon(NIM_ADD, @FIconData);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
	// トレイアイコンを削除
	Shell_NotifyIcon(NIM_DELETE, @FIconData);
end;

{ 閉じる }
procedure TForm1.Button1Click(Sender: TObject);
begin
	Close
end;

end.