|
||
解説: タスクトレイに常駐するソフトをスタートアップに登録して、起動させると、トレイアイコンが表示されないことがあります。 ソフトは起動しているのですが、トレイアイコンに登録されないので、終了するには、タスクマネージャの世話になる羽目に陥ります。 これはシェルのハングアップを考慮して、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)); } //------------------------------------------------------------------- |