To display a notification we use the SHNotificationAdd() function. This API takes a pointer to SHNOTIFICATIONDATA structure and this contains all the details about the notification that you want to show. The structure is defined as below,
DWORD cbStruct;
DWORD dwID;
SHNP npPriority;
DWORD csDuration;
HICON hicon;
DWORD grfFlags;
CLSID clsid;
HWND hwndSink;
LPCTSTR pszHTML;
LPCTSTR pszTitle;
LPARAM lParam;
union
{
SOFTKEYMENU skm;
SOFTKEYNOTIFY rgskn[NOTIF_NUM_SOFTKEYS];
}
LPCTSTR pszTodaySK;
LPCTSTR pszTodayExec;
} SHNOTIFICATIONDATA;
dwID: identifier of this notification, you can give any unique number here
npPriority: priority of the notification. This can take two values, SHNP_INFORM or SHNP_ICONIC
csDuration: duration in seconds, contains the number of seconds that the notification should be displayed for
grfFlags: this contains some flags for the notification, this can take values like, SHNF_CRITICAL (displays the notification with a red border), SHNF_DISPLAYON (the device display is forced to turn on), SHNF_HASMENU (the notification is created with a softkey bar), SHNF_SILENT (does not vibrate or play a sound on the device) etc
clsid: defines a CLSID (a GUID) for the notification, you can create a GUID by using the GuidGen.exe tool which ships with Visual Studio
hwndSink: handle to the window which will receive messages from the notification (for e.g. if the user selects a menu item)
pszHTML: HTML content of the notification
pszTitle: contains the title of the notification
lParam: user defined param
skm: SOFTKEYMENU structure that defines menu for the softkey bar, the SHNF_HASMENU flag in grfFlags member must be set
rgskn: used if the notification is to have two softkeys
pszTodaySK: this contains the string that is displayed on the left softkey when csDuration seconds have elapsed, by default the text used is "Notification"
pszTodayExec: defines the name of the executable file which will run when the user presses the left softkey
// {1F1C029E-95B2-4b5d-A2C5-AEF74BFCA979}
static const GUID CLSID_SHOW_NOTI =
{ 0x1f1c029e, 0x95b2, 0x4b5d, { 0xa2, 0xc5, 0xae, 0xf7, 0x4b, 0xfc, 0xa9, 0x79 } };
static HINSTANCE g_hInst = NULL;
int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR lpCmdLine, int nShowCmd)
{
SHNOTIFICATIONDATA shNotiData = {0};
g_hInst = hInst;
shNotiData.cbStruct = sizeof(shNotiData);
shNotiData.dwID = 1;
shNotiData.npPriority = SHNP_INFORM;
shNotiData.csDuration = 5; //time in seconds
shNotiData.hicon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1));
shNotiData.clsid = CLSID_SHOW_NOTI;
//shNotiData.clsid = CLSID_SHNAPI_OemNotif1;
shNotiData.grfFlags = SHNF_TITLETIME | SHNF_CRITICAL;//0;
shNotiData.pszTitle = TEXT("My Notification");
shNotiData.pszHTML = TEXT("<html><body>This program shows how to display a notification.</body></html>");
shNotiData.rgskn[0].pszTitle = TEXT("Dismiss");
shNotiData.rgskn[0].skc.wpCmd = 1001;
shNotiData.pszTodaySK = TEXT("Alert!");
Sleep(500);
SHNotificationAdd(&shNotiData);
return 0;
}
Below is a video of the above program, running.