AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>タスクトレイにアイコンを追加する
Delphi Tips
Delphi Win32API
ダウンロード

Delphi Tips & Tricks

タスクトレイにアイコンを追加する

 タスクトレイに常駐するタイプのソフトでは必須のプログラムです。、Delphian Worldなどで公開されているVCLを使うと簡単にできますが実際にコードを書くとこんな感じになります。
 (このサンプルはバルーンヘルプはサポートしていませんのであしからず)
uses
  SHELLAPI;
------------------------------------------------------------------
private
  //uCallbackMessageで定義したメッセージのイベントハンドラ
  procedure TrayIconmsg(var msg :TMessage); message WM_USER+100;
------------------------------------------------------------------
var
  NID :TNOTIFYICONDATA;

//起動時にアイコンを追加
procedure TForm1.FormCreate(Sender: TObject);
begin
  NID.cbSize :=SizeOf(TNOTIFYICONDATA);//レコードのサイズ
  NID.Wnd :=handle;
  NID.uID :=1;  //アプリケーション定義の数値
  NID.uFlags :=NIF_MESSAGE or NIF_ICON or NIF_TIP;
  NID.uCallbackMessage :=WM_USER + 100;//トレイアイコンに送られてくるメッセージ
  NID.hIcon :=Application.Icon.Handle;//任意のアイコンハンドルを指定
  NID.szTip :='Tray Icon sample';//トレイアイコンのヒントの文字列
    //アイコンを追加
  Shell_NotifyIcon(NIM_ADD, @NID);
end;
//トレイアイコンに送られてくるメッセージの処理
procedure Tform1.TrayIconmsg(var msg :TMessage);
begin
  case msg.LParam of
  WM_RBUTTONUP:begin
               SetforegroundWindow(Handle);//ウィンドウを最前面に
               Popupmenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
               end;
  end; //case msg..
end;

procedure Tform1.Button1Click(sender :TObject);
var
  HICO :HICON;
  WO :Word;
begin
  if Opendialog1.Execute then begin
    WO :=0;
    HICO :=ExtractassociatedIcon(hinstance,PChar(opendialog1.FileName),WO);
    NID.hicon :=HICO;
    NID.szTip :='アイコンを変更しました';
    Shell_NotifyIcon(NIM_MODIFY,@NID);
  end;
end;

procedure Tform1.FormDestroy(sender :TObject);
begin
  Shell_NotifyIcon(NIM_DELETE, @NID);
end;

TNOTIFYICONDATA構造体を組み立ててShell_NofityIcon()でアイコンを表示を変更します。
TNOTIFYICONDATA構造体の各データはコメントを参照してください。uFlagは下表のフラグの組み合わせです。
NIF_MESSAGE uCallbackMessageをフィールドを有効にする
NIF_ICON hiconをフィールドを有効にする
NIF_TIP szTipをフィールドを有効にする
Shell_NotifyIconは第1引数に動作 NIM_ADD=追加 NIM_MODIFY=変更 NIM_DELETE=削除 を指定して、第2引数にTNOTIFYICONDATA構造体のアドレスをわたします。

WM_LBUTTONDOWN マウス押下のとき
WM_LBUTTONDBLCLK ダブルクリックのとき
WM_LBUTTONUP マウスを離したとき
アイコンをクリックしたりしたときのメッセージはuCallbackMessageで定義したWM_USER+100(後ろの数はいくつでもいい)を処理します。TMessageのlparamにウィンドウメッセージが入っているので、case文などで処理を分けます。