新規記事の投稿を行うことで、非表示にすることが可能です。
2014年08月23日
エクスプローラ再起動時におけるトレイアイコンの再登録
アプリを開発していて、タスクトレイ(現在は通知エリア?)にアイコンを登録し、右クリックでメニューを出して操作するというのは定番スタイルである
通常は困らないのだが、時折エクスプローラが死んで再起動されると、アイコンが消えてしまい、操作ができなくなってしまうという困った現象が起こることがある
それに対応するには、エクスプローラが再起動したというタイミングをとらえてアイコンを再登録する必要があるのだが、そのタイミングをどうやってとらえるかが問題だった
昔、XP時代にも何かやっていた記憶があるのだが、ソースも記憶も彼方に逝ってしまったので、改めて調べてみた
WEBを検索してみると、システムアイコンなどが消えた場合の復旧方法などばかりが引っかかり、アプリの開発方法はなかなかヒットしなかった
ようやく見つかり、わかりやすかったのはここだった
改めて自分でも整理してみた
全体の基本構造は以下のような感じである
ちなみに、アイコンの登録やアイコンの変更などは以下のような感じ
最初に作るなら、このクレジットカード!
ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)〜ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。
▼ロリポップ!レンタルサーバーはこちら
通常は困らないのだが、時折エクスプローラが死んで再起動されると、アイコンが消えてしまい、操作ができなくなってしまうという困った現象が起こることがある
それに対応するには、エクスプローラが再起動したというタイミングをとらえてアイコンを再登録する必要があるのだが、そのタイミングをどうやってとらえるかが問題だった
昔、XP時代にも何かやっていた記憶があるのだが、ソースも記憶も彼方に逝ってしまったので、改めて調べてみた
WEBを検索してみると、システムアイコンなどが消えた場合の復旧方法などばかりが引っかかり、アプリの開発方法はなかなかヒットしなかった
ようやく見つかり、わかりやすかったのはここだった
改めて自分でも整理してみた
全体の基本構造は以下のような感じである
UINT g_uTaskbarCreatedMessage = 0;
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_CREATE:
// ここ、あるいはプログラムメイン開始時などで以下を実行する
g_uTaskbarCreatedMessage = RegisterWindowMessage(_T("TaskbarCreated"));
break;
case WMU_NOTIFY_ICON:
switch (lParam) {
case WM_CONTEXTMENU:
{
// ここでメニュー表示処理を行う
// ここに来れるためには、NIM_SETVERSION で4を設定しておく必要がある
}
break;
}
return 0;
default:
if (uMsg == g_uTaskbarCreatedMessage) {
// ここでアイコンの再登録処理を行う
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
ちなみに、アイコンの登録やアイコンの変更などは以下のような感じ
#define WMU_NOTIFY_ICON (WM_APP+1)
#define MAX_RETRY 2
bool ReleatedlyNotifyIcon(UINT nimCommand, NOTIFYICONDATA* pnid)
{
int count = MAX_RETRY;
while (--count > 0) {
if (Shell_NotifyIcon(nimCommand, pnid) {
return true;
}
}
Sleep(100);
}
bool RegisterIcon(HWND hWnd, HICON hIcon)
{
NOTIFYICONDATA nid = {0};
nid.cbSize = sizeof(nid);
nid.hWnd = hWnd;
nid.hIcon = hIcon;
nid.uCallbackMessage = WMU_NOTIFY_ICON;
nid.uFlags = NIF_ICON|NIF_MESSAGE;
if (!RepeatNotifyIcon(NIM_ADD, nid)) {
return false;
}
// バージョン設定
nid.uVersion= 4;
return RepeatNotifyIcon(NIM_SETVERSION, nid);
}
bool ChangeIcon(HWND hWnd, HICON hIcon)
{
NOTIFYICONDATA nid = {0};
nid.cbSize = sizeof(nid);
nid.hWnd = hWnd;
nid.hIcon = hIcon;
nid.uFlags = NIF_ICON;
return RepeatNotifyIcon(NIM_MODIFY, nid);
}
最初に作るなら、このクレジットカード!
ロリポップ!レンタルサーバー!はあなたの「やってみたい!」を応援します!
ロリポップ!なら、ホームページ、ブログ、ネットショップ…
これらが今すぐ、そして簡単にできちゃう!
マニュアルやライブチャットを完備しているので、ホームページ初心者でも安心。
これだけついてるのに月額100円(税抜)〜ととってもお得。
もちろん無料のお試し期間も10日間あるので安心ですね。
▼ロリポップ!レンタルサーバーはこちら