ホーム
| アプリケーション | Tips | ダウンロード | プログラム
| コラム

CBアプリ工房


Tips

Shell_NotifyIcon を使ってタスクアイコンを表示 

更新 : 2010/04/29

 



解説:
タスクトレイにアイコンを表示するアプリケーションは常駐ソフトでよく見かけます。
使う時だけタスクトレイから呼び出し、使わなくなったらアイコンとして格納できるので使い勝手がよいです。
実用では、細かいところまで制御する必要があるのですが、今回は、そうした細かいところは目をつむり、タスクトレイにアイコンを表示するための手順を見て行きます。

タスクトレイにアイコンを表示するには、API 関数の Shell_NotifyIcon を使用します。この関数は、タスクバーのステータスエリアにメッセージを送信します(「
タスクアイコンが登録されない」も参考にしてください)。

ちょっと寄り道

BOOL Shell_NotifyIconA(
    DWORD dwMessage,        // 送信するメッセージ
    PNOTIFYICONDATA pnid // NOTIFYICONDATA 構造体
);

// NOTIFYICONDATA 構造体
DWORD cbSize;            // 構造体のサイズ
HWND hWnd;                // 通知を受け取るウインドウのハンドル
UINT uID;                     // アイコンを識別するためのナンバー
UINT uFlags;                 // アイコン画像を表示,ツールチップ表示を有効にするなど
UINT uCallbackMessage;// メインウィンドウに通知するメッセージを指定
HICON hIcon;               // アプリケーションのアイコンハンドル
TCHAR szTip[64];         // アイコン上にマウスポインタを乗せたときに表示される
                                  // ツールチップの文字列。

使用例:
アプリケーション起動と同時にタスクトレイにアイコンを表示しています。

コンポーネントは特にありません。

コーディングでは、"Unit1.h" にアイコンをタスクトレイに置くための構造体 taskicon を宣言しておきます。

"Unit1.cpp" の OnCreate イベントでは、 構造体 taskicon に必要な値を代入して、
Shell_NotifyIcon 関数を実行しています。これで タスクトレイにアイコンが表示されます。
アプリケーション終了時、OnDestroy イベントでタスクトレイアイコンを削除しています。

今回は、流れを掴むため、単純な動きでした。時間があれば、起動時にフォームを消したり、タスクバーからアイコンを消したりするなどのコードを追加してみるといいと思います。

"Unit1.h"
#include "shellapi.h"
private:
     NOTIFYICONDATA taskicon;

"Unit1.cpp"
//-------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    taskicon.cbSize = sizeof(NOTIFYICONDATA);
    taskicon.hWnd  = Handle;
    taskicon.uID     = 1;
    taskicon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    // WM_NOTIFY は、コントロールにイベントが発生したときやコントロールが
    // データを要求しているとき親ウィンドウに送られます
    taskicon.uCallbackMessage = WM_NOTIFY;
    taskicon.hIcon = Application->Icon->Handle;
    // 文字列をバッファにコピー
    lstrcpy(taskicon.szTip, "TaskIcon");

    // タスクトレイにアイコンを表示
    Shell_NotifyIcon(NIM_ADD, &taskicon);
}
//-------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    // タスクトレイのアイコンを削除
    Shell_NotifyIcon(NIM_DELETE, &taskicon);
}
//-------------------------------------------------------------------



[ ホーム | ページトップ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.