
タスクトレイにアイコンを置き、バルーンチップを表示するプログラムサンプル。
WM_CREATEでトレイアイコンを設置。
ボタンを押すとトレイアイコンの位置にバルーンチップを表示します。
参考になれば幸い。
#define _WIN32_WINNT 0x501
#include <windows.h>
#define CLASS_NAME TEXT("BalloonTest")
#define WINDOW_TITLE TEXT("BalloonTest")
#define BUTTON_TITLE TEXT("Balloon")
#define IDC_BTN_BALLOON 1
#define TASKTRAY_ID 2
#define WM_TASKTRAY (WM_APP+1)
void balloon( HWND hWnd )
{
if ( hWnd )
{
NOTIFYICONDATA notifyIcon = {0};
notifyIcon.cbSize = sizeof(notifyIcon);
notifyIcon.hWnd = hWnd;
notifyIcon.uID = TASKTRAY_ID;
notifyIcon.uFlags = NIF_INFO;
notifyIcon.dwInfoFlags = NIIF_ERROR;
lstrcpy( notifyIcon.szInfoTitle, TEXT("バルーンタイトル") );
lstrcpy( notifyIcon.szInfo, TEXT("バルーン文字") );
Shell_NotifyIcon( NIM_MODIFY, ¬ifyIcon );
}
}
void putTrayIcon( HWND hWnd )
{
// タスクトレイアイコン追加
NOTIFYICONDATA notifyIcon = {0};
notifyIcon.cbSize = sizeof(notifyIcon);
notifyIcon.uID = TASKTRAY_ID;
notifyIcon.hWnd = hWnd;
notifyIcon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
notifyIcon.uCallbackMessage = WM_TASKTRAY;
notifyIcon.hIcon = LoadIcon( NULL, IDI_APPLICATION );
lstrcpy( notifyIcon.szTip, WINDOW_TITLE );
Shell_NotifyIcon( NIM_ADD, ¬ifyIcon );
}
void removeTrayIcon( HWND hWnd )
{
NOTIFYICONDATA notifyIcon = {0};
notifyIcon.cbSize = sizeof(notifyIcon);
notifyIcon.hWnd = hWnd;
notifyIcon.uID = TASKTRAY_ID;
Shell_NotifyIcon( NIM_DELETE, ¬ifyIcon );
}
LRESULT CALLBACK wndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp )
{
static UINT uiTaskbarRestart = WM_NULL;
switch ( msg )
{
case WM_CREATE:
putTrayIcon( hWnd );
uiTaskbarRestart = RegisterWindowMessage( TEXT("TaskbarCreated") );
break;
case WM_CLOSE:
removeTrayIcon( hWnd );
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_COMMAND:
switch( LOWORD(wp) )
{
case IDC_BTN_BALLOON:
balloon( hWnd );
break;
}
return 0;
case WM_TASKTRAY:
switch ( lp )
{
case WM_LBUTTONDOWN:
MessageBox( hWnd, TEXT("タスクトレイクリック"), WINDOW_TITLE, MB_OK );
return 0;
case NIN_BALLOONUSERCLICK:
MessageBox( hWnd, TEXT("バルーンクリック"), WINDOW_TITLE, MB_OK );
return 0;
}
break;
}
// タスクバー再起動時のアイコン再設定処理
if ( msg == uiTaskbarRestart )
{
removeTrayIcon( hWnd );
putTrayIcon( hWnd );
}
return DefWindowProc( hWnd , msg , wp , lp );
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow )
{
WNDCLASS winc = {0};
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = wndProc;
winc.cbClsExtra = 0;
winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = CLASS_NAME;
if ( !RegisterClass(&winc) ) return 0;
HWND hWnd = CreateWindow(
CLASS_NAME, WINDOW_TITLE,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, NULL, NULL,
hInstance, NULL );
if ( hWnd == NULL ) return 0;
CreateWindow(
TEXT("BUTTON"), BUTTON_TITLE,
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 10, 300, 100, hWnd, reinterpret_cast(IDC_BTN_BALLOON), hInstance, NULL );
MSG msg;
while ( GetMessage(&msg, NULL, 0, 0) )
{
DispatchMessage(&msg);
}
return msg.wParam;
}
ちなみに、dwInfoFlags にNIIF_ERRORを指定するとバルーンのアイコンがこうなります。
NIIF_NONEだとアイコンなしに。

2015-03-19
uiTaskbarRestart の初期値を WM_NULL に変更。存在を忘れてた。
0 件のコメント:
コメントを投稿