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

CBアプリ工房


Tips

「タスクアイコンが登録されない」に対処 

更新 : 2010/04/29

 



解説:
タスクトレイに常駐するソフトをスタートアップに登録して、起動させると、トレイアイコンが表示されないことがあります。
ソフトは起動しているのですが、トレイアイコンに登録されないので、終了するには、タスクマネージャの世話になる羽目に陥ります。

これはシェルのハングアップを考慮して、4 秒以内に登録できないと制御を戻す、仕様だからです。つまりウィンドウズの起動に時間がかかり、タイムアウトすると表示されなくなります。
この辺の詳細は、回避策も含め、マイクロソフトのサポートオンラインにありますので、参考にしてください。

使用例:
回避コードを記述すると、アプリケーションをウィンドウズのスタートアップから起動しても、アイコンが登録されるようになります。

準備として、コンポーネントの配置は特にありません。

OnCreate に回避コードを記述します。

回避コードは、Shell_NotifyIcon が false, GetLastError が ERROR_TIMEOUT を返した時、処理します。
まず、再登録するまで数秒待ち、Shell_NotifyIcon の引数に NIM_MODIFY を渡し、false が返るのを確認(アイコンが登録されれば do 文を抜ける)して、リトライ後、ダメなら再び待機、という流れです。

OnDestroy にアイコンの削除コードを記述します。

時間のある方は、回避コードをコメントアウトして、トレイアイコンの登録状態を比較してみるといいでしょう。なお、登録、削除のコードは Tips にありますので、そちらを参照してください。

//-------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    // スタートアップから起動するとトレイアイコンが表示されない、に対処

    if (!Shell_NotifyIcon(NIM_ADD, &taskicon) 
                && (GetLastError() == ERROR_TIMEOUT)) {
        do {
            Sleep(2000);// リトライするまで待機(数値は適当)

            // false を返すことを確認
            if (Shell_NotifyIcon(NIM_MODIFY, &taskicon)) break;

        } while (!Shell_NotifyIcon(NIM_ADD, &taskicon));
}
//-------------------------------------------------------------------



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