windows 气泡提示
windows 气泡使用API Shell_NotifyIcon,首先需要使用Shell_NotifyIcon 的ADD添加一个通知icon,就是windows通知小窗口里面的小图标,之后再利用NIM_MOIDFY显示对应的气泡
大致代码 AddNotificationIcon
BOOL AddNotificationIcon(HWND hwnd) { NOTIFYICONDATA nid = {sizeof(nid)}; nid.hWnd = hwnd; // add the icon, setting the icon, tooltip, and callback message. // the icon will be identified with the GUID nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE | NIF_SHOWTIP | NIF_GUID; nid.guidItem = __uuidof(SpiderIcon); //nid.uCallbackMessage = WMAPP_NOTIFYCALLBACK; LoadIconMetric(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_NOTIFICATIONICON), LIM_SMALL, &nid.hIcon); //LoadString(GetModuleHandle(NULL), IDS_TOOLTIP, nid.szTip, ARRAYSIZE(nid.szTip)); std::wstring test = L"Spider"; wcscpy(nid.szTip, test.c_str()); //memcpy(nid.szTip, test.c_str(), test.size()); Shell_NotifyIcon(NIM_ADD, &nid); // NOTIFYICON_VERSION_4 is prefered nid.uVersion = NOTIFYICON_VERSION_4; return Shell_NotifyIcon(NIM_SETVERSION, &nid); }
ShowPrintJobBalloon
BOOL ShowPrintJobBalloon() { // Display a balloon message for a print job with a custom icon NOTIFYICONDATA nid = {sizeof(nid)}; nid.uFlags = NIF_INFO | NIF_GUID; nid.guidItem = __uuidof(SpiderIcon); nid.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON; std::wstring title = L"Spider集控"; std::wstring szInfo = L"打扰了,收到来自集控的关机指令,将在您用完之后执行"; //wcscpy(nid.szInfoTitle, title.c_str()); wcscpy(nid.szInfo, szInfo.c_str()); //LoadString(g_hInst, IDS_PRINTJOB_TITLE, nid.szInfoTitle, ARRAYSIZE(nid.szInfoTitle)); //LoadString(g_hInst, IDS_PRINTJOB_TEXT, nid.szInfo, ARRAYSIZE(nid.szInfo)); LoadIconMetric(g_hInst, MAKEINTRESOURCE(IDI_NOTIFICATIONICON), LIM_LARGE, &nid.hBalloonIcon); return Shell_NotifyIcon(NIM_MODIFY, &nid); }
注意点:
- Notification需要一个唯一ID(再win7以及win7以上),第一次运行程序时会将这个uuid和你的应用程序绑定再一起(注意是和你的决定路径),你的exe如果路径变了UUID也需要变,即一个uuid对应着一个你的应用程序(绝对路径)
- 你的窗口可以是隐藏的,但是如果处在全屏模式或者投影等模式,windows将会自动开启专注助手以防止用户受打扰,所以再开启之后你的通知将不会显示,解决这个有两种方案,一将窗口显示出来,二是禁止专注助手。