2017-12-04 25 views
0

私はサービスとして動作するアプリケーションと、サービスを監視するセカンダリアプリケーションを持っています。監視アプリケーションは、システムトレイにNOTIFYICONDATAを使用して正常に動作します。NOTIFYICONDATAアイコン通知C++

私が現在やりたいことは、アプリケーションがサービスが停止したことに気づいたときです。通知が表示されるようにします(電池がノートパソコンで不足している場合と同様です)。コードをthis articleから外しています。私がしなければならない機能は以下の通りです。

void CALLBACK checkit(HWND hwnd, UINT umsg, UINT timerid, DWORD dwtime) { 
    if (isServiceRunning()) { 
     if (nidApp.dwInfoFlags != NIIF_NONE) { 
      Log("dwInfoFlags != NIFF_NONE"); 
      nidApp.dwInfoFlags = NIIF_NONE; 
      strcpy_s(nidApp.szInfoTitle, sizeof(nidApp.szInfoTitle), ""); 
      strcpy_s(nidApp.szInfo, sizeof(nidApp.szInfoTitle), ""); 
      Log("%d", Shell_NotifyIcon(NIM_MODIFY, &nidApp)); 
     } 
    } else { 
     if (nidApp.dwInfoFlags != NIIF_WARNING) { 
      Log("dwInfoFlags != NIIF_WARNING"); 
      nidApp.dwInfoFlags = NIIF_WARNING; 
      strcpy_s(nidApp.szInfoTitle, sizeof(nidApp.szInfoTitle), "Service Stopped"); 
      strcpy_s(nidApp.szInfo, sizeof(nidApp.szInfo), "The " PROGRAM_NAME " service has been stopped. Any runs in progress have been terminated."); 
      nidApp.uTimeout = 10000; 
      Log("%d", Shell_NotifyIcon(NIM_MODIFY, &nidApp)); 
     } 
    } 
} 

この機能は5秒ごとに呼び出されます。ログを使用して、dwInfoFlagsが正しく設定されており、Shell_NotifyIconTRUEを返すことがわかりましたが、通知は表示されません。私は何かが欠けているに違いないと確信していますが、それが何であるか把握できません。

nidAppは、以下のように設定があるようNOTIFYICONDATA nidApp;としてCPPファイルの先頭で定義されています

hMainIcon = LoadIcon(hInstance, (LPCTSTR)MAKEINTRESOURCE(IDI_ICON1)); 
nidApp.cbSize = sizeof(NOTIFYICONDATA); // sizeof the struct in bytes 
nidApp.hWnd = (HWND)hWnd;   //handle of the window which will process this app. messages 
nidApp.uID = IDI_ICON1;  //ID of the icon that willl appear in the system tray 
nidApp.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_GUID | NIF_SHOWTIP; //ORing of all the flags 
nidApp.hIcon = hMainIcon; // handle of the Icon to be displayed, obtained from LoadIcon 
nidApp.uCallbackMessage = WM_USER_SHELLICON; 
nidApp.uVersion = NOTIFYICON_VERSION_4; 
nidApp.guidItem = myGUID; 
strcpy_s(nidApp.szTip, sizeof(nidApp.szTip), PROGRAM_NAME " Service Controller"); 
Shell_NotifyIcon(NIM_ADD, &nidApp); 
Shell_NotifyIcon(NIM_SETVERSION, &nidApp); 

答えて

2

あなたが通知を表示するnidApp.uFlagsNIF_INFOに設定する必要があります。今すぐ通知アイコンを作成するために使用されたのと同じフラグでShell_NotifyIconを呼び出しています。

+0

ありがとうございます。私はuFlagsオプションの残りの部分にこれを追加しました。 –

関連する問題