// タスクトレイにアイコンを追加する基本
//
// : 最小化ボタンでタスクトレイに格納(同時にバルーン情報を表示)
// : タスクトレイのアイコンをクリックして復帰
// : タスクトレイのアイコンを右クリックしてアイコンを変更
//
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
#define _WIN32_IE 0x0600
#include <windows.h>
#define IDD_DIALOG1 101
LRESULT CALLBACK DlgWndProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
int wmId, wmEvent;
static const int ID_MYTRAY = WM_APP + 1;
static const int MYTRAY_MESSAGE = WM_APP + 2;
static NOTIFYICONDATA ni;
static bool bIcon = true;
switch(msg) {
case MYTRAY_MESSAGE:
if(wp == ID_MYTRAY)
switch(lp)
{
case WM_LBUTTONDOWN:
ShowWindow(hDlg, SW_SHOW);
Shell_NotifyIcon(NIM_DELETE, &ni);
// タスクトレイからアイコンを削除
break;
case WM_RBUTTONDOWN:
if(bIcon) {
ni.hIcon = (HICON)LoadIcon(NULL, IDI_WARNING);
bIcon = false;
} else {
ni.hIcon = (HICON)LoadIcon(NULL, IDI_QUESTION);
bIcon = true;
}
Shell_NotifyIcon(NIM_MODIFY, &ni);
// タスクトレイのアイコンを変更
Shell_NotifyIcon(NIM_MODIFY, &ni);
// タスクトレイ情報の更新
break;
}
break;
case WM_INITDIALOG:
SetWindowText(hDlg, "最小化ボタンでタスクトレイに格納");
memset(&ni, 0, sizeof(NOTIFYICONDATA));
ni.cbSize = sizeof(NOTIFYICONDATA);
ni.hWnd = hDlg;
ni.uID = ID_MYTRAY;
ni.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
ni.hIcon = (HICON)LoadIcon(NULL, IDI_QUESTION);
ni.uCallbackMessage = MYTRAY_MESSAGE;
lstrcpy(ni.szTip, "クリックでタスクトレイから出す");
// バルーン表示
lstrcpy(ni.szInfoTitle,"情報!");
lstrcpy(ni.szInfo,"只今、最小化されました!");
ni.dwInfoFlags = NIIF_INFO;
break;
case WM_SYSCOMMAND:
wmId = LOWORD(wp);
wmEvent = HIWORD(wp);
switch(wmId) {
case SC_MINIMIZE:
ShowWindow(hDlg, SW_HIDE);
/* バルーン表示機能のセット */
ni.uFlags = (ni.uFlags | NIF_INFO);
Shell_NotifyIcon(NIM_ADD, &ni);// タスクトレイにアイコンを追加
// 同時にバルーン情報を表示
/* バルーン表示機能の解除 */
ni.uFlags = (ni.uFlags & ~NIF_INFO);
Shell_NotifyIcon(NIM_MODIFY, &ni);// タスクトレイ情報の更新
break;
default:
return FALSE;
}// switch(wmId)
break;
// デフォルトのウインドウプロシージャには渡さないため
// break して TRUE を返す
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return FALSE;
}// switch(msg)
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int nCmdShow)
{
BYTE data[] = { 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xca, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00,
0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00,
0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6f, 0x00,
0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01,
0x00, 0x01, 0x4d, 0x00, 0x53, 0x00, 0x20, 0x00,
0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00,
0x6c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6c, 0x00,
0x67, 0x00, 0x00, 0x00 };
HWND hWnd = CreateDialogIndirectParam(hInstance,
(LPCDLGTEMPLATEA)data, NULL, (DLGPROC)DlgWndProc, 0);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
最終更新:2011年07月23日 00:12