/*
    タスクトレイへのアイコン追加
      2003/ 2/ 7  宍戸 輝光
*/

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,
                    PSTR szCmdLine,int iCmdShow){

	HWND hwMain;
	MSG msg;
	WNDCLASS wndclass;

	wndclass.style         = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc   = WndProc;
	wndclass.cbClsExtra    = 0;
	wndclass.cbWndExtra    = 0;
	wndclass.hInstance     = hInstance;
	wndclass.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hCursor       = LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName  = NULL;
	wndclass.lpszClassName = "CWindow";

	RegisterClass(&wndclass);

	hwMain=CreateWindow("CWindow","タスクトレイへのアイコン追加",
	       WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
	       560,480,NULL,NULL,hInstance,NULL);

	ShowWindow(hwMain,iCmdShow); /* ウインドウを表示 */
	UpdateWindow (hwMain);        /* 再描画 */

	while(GetMessage(&msg,NULL,0,0)) { /* メッセージループ */

		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}

	return msg.wParam ;

}

LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam) {

	static HICON hIcon;
	static NOTIFYICONDATA icdata;

	switch (iMsg) {

	case WM_CREATE: /* ウインドウ生成時 */

		/* タスクトレイに追加するアイコンのハンドルを取得 */
		hIcon=LoadIcon(NULL,IDI_APPLICATION);

		/* NOTIFYICONDATA設定 */
		icdata.cbSize=sizeof(NOTIFYICONDATA);
		icdata.hWnd=hwnd;
		icdata.uID=0;
		icdata.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
		icdata.uCallbackMessage=WM_USER;
		icdata.hIcon=hIcon;
		CopyMemory(icdata.szTip,"Test",5);

		/* タスクトレイにアイコン追加 */
		Shell_NotifyIcon(NIM_ADD,&icdata);

		return 0;

	case WM_USER: /* タスクトレイのアイコンメッセージ */

		switch(lParam) {

		case WM_LBUTTONDOWN: /* 左ボタンクリック */

			MessageBox(hwnd,"左クリック","アイコンメッセージ",MB_OK);

			break;

		}

		return 0;

	case WM_DESTROY: /* ウインドウ破棄時 */

		/* タスクトレイからアイコン削除 */
		Shell_NotifyIcon(NIM_DELETE,&icdata);

		PostQuitMessage(0);

		return 0;

	}

	return DefWindowProc(hwnd,iMsg,wParam,lParam);

}