Shell_NotifyIcon(NIM_DELETE, &m_tnd);
アプリケーションがクラッシュした場合に C++ での呼び出しを保証する方法は多数あります。使用している にRAIIラッパーをNOTIFYICONDATA
使用すると、次のように機能します。
struct NID
{
NID() : icon_data() { icon_data.cbSize = sizeof(icon_data); }
~NID() { Shell_NotifyIcon(NIM_DELETE, &icon_data); }
void Show(HWND w) { icon_data.hWnd = w; Shell_NotifyIcon(NIM_ADD, &icon_data); }
NOTIFYICONDATA icon_data;
};
これはラッパーの単純化されたバージョンですが、主なアイデアを説明します: のインスタンスをNID
静的ストレージに作成すると、WinMain
ormain
呼び出しの前に初期化され、そのデストラクタがプログラムのクリーンアップ時に呼び出されます。異常終了。
したがって、このリソースを次のようNOTIFYICONDATA
にラップして使用できます。struct NID
NID nid; // <--- automatic storage duration, cleared after WinMain return
// even if it returns normal or abnormally
int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
// GetMessage(&message, NULL, 0, 0) loop ...
// ...
// use nid.icon_data as you please
}
catch (...)
{
// something bad happened...
}
return 0;
}
上記の例では~NID()
、プログラムが終了したとき (例外の後またはプログラムを閉じた後) を呼び出し、デストラクタが呼び出さShell_NotifyIcon(NIM_DELETE, &icon_data);
れ、通知領域からアイコンが削除されます。このコードは、通常の終了と例外終了をカバーしています。このトピックの詳細については、 NPEからの適切な回答を参照してください。
プロセスを強制終了する場合については、これを行う簡単な方法はありません。
私はすでにそれをテストしてstd::atexit
おり、タスクマネージャーを介してプログラムを強制終了した後に関数が呼び出されないため、終了呼び出しをフックstd::at_quick_exit
する必要があると思います...かなり複雑なタスクのようですが、 BSHからのこの回答で説明されています:
TerminateProcess
プロセスが終了した (閉じられていない) 場合、フックまたはNtTerminateProcess
タスク マネージャー プロセスで何らかのフックを開始しない限り、何も実行できません。
それが役立つことを願っています(ただし、6年後の答えです笑)