2009-04-22 2 views
2

私が見たすべてのことによると、次のC++プログラムでは、アプリケーションウィンドウを左クリックしてもトレイアイコンからバルーンツールチップが表示されるはずですが、動作していません。私が何が欠けているか教えてもらえますか?Shell_NotifyIconバルーンチップが動作しないのはなぜですか?

これは、Shell32.dllのバージョン6.0(DllGetVersionで検証済み)のXP上にあります。

ありがとうございます!

#include "stdafx.h" 
    #include "shellapi.h" 

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 

    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
    { 
     MSG msg; 

     WNDCLASS wc; 
     memset(&wc, 0, sizeof(wc)); 
     wc.lpfnWndProc = WndProc; 
     wc.hInstance = hInstance; 
     wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
     wc.lpszClassName = "sysTrayTest"; 
     RegisterClass(&wc); 

     HWND hWnd = CreateWindow("sysTrayTest", "", 
           WS_OVERLAPPEDWINDOW, 
           CW_USEDEFAULT, 0, 500, 500, 
           NULL, NULL, hInstance, NULL); 
     if (hWnd) 
     { 
      ShowWindow(hWnd, nCmdShow); 
      while (GetMessage(&msg, NULL, 0, 0)) 
      { 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
      } 
     } 

     return 0; 
    } 

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
     switch (message) 
     { 
      case WM_DESTROY: 
      { 
       NOTIFYICONDATA nid; 
       memset(&nid, 0, sizeof(NOTIFYICONDATA)); 
       nid.cbSize = sizeof(NOTIFYICONDATA); 
       nid.hWnd = hWnd; 
       nid.uID = 1; 
       Shell_NotifyIcon(NIM_DELETE, &nid); 

       PostQuitMessage(0); 
      } 
      break; 

      case WM_CREATE: 
      { 
       NOTIFYICONDATA nid; 
       memset(&nid, 0, sizeof(NOTIFYICONDATA)); 
       nid.cbSize = sizeof(NOTIFYICONDATA); 
       nid.hWnd = hWnd; 
       nid.uID = 1; 
       nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
       nid.uCallbackMessage = WM_USER + 200; 
       nid.hIcon = LoadIcon(NULL, IDI_INFORMATION); 
       lstrcpy (nid.szTip, "Test Tip"); 
       Shell_NotifyIcon(NIM_ADD, &nid); 
      } 
      break; 

      case WM_LBUTTONDOWN: 
      { 
       NOTIFYICONDATA nid; 
       memset(&nid, 0, sizeof(NOTIFYICONDATA)); 
       nid.cbSize = sizeof(NOTIFYICONDATA); 
       nid.hWnd = hWnd; 
       nid.uID = 1; 
       nid.uFlags = NIF_INFO; 
       lstrcpy(nid.szInfo, "Test balloon tip"); 
       lstrcpy(nid.szInfoTitle, "Test Title"); 
       nid.dwInfoFlags = NIIF_INFO; 
       nid.uTimeout = 15000; 
       Shell_NotifyIcon(NIM_MODIFY, &nid); 
      } 
      break; 

      default: 
       return DefWindowProc(hWnd, message, wParam, lParam); 
     } 
     return 0; 
    } 
+0

これはXP上であり、DllGetVersion()は6.0を返します。 –

答えて

12

バー、私はそれを理解しました。 ...

NOTIFYICONDATA _ V3 _ SIZE == 504
NOTIFYICONDATA _ V2 _ SIZE一方私はヘッダといくつかの理由...

はsizeof(NOTIFYICONDATA)== 508

ため= = 488
NOTIFYICONDATA _ V1 _ SIZE == 88

IがV2またはV3の代わりのsizeof(NOTIFYICONDATA)のいずれかを指定した場合、バルーンヒントが表示さまあまあです。

+3

その人に葉巻を与えます。あなたはたぶん私を数時間節約したでしょう。あなたの答えを正しいとマークして、担当者を得ましょう! –

+0

ユニコードの場合:NOTIFYICONDATAW_V2_SIZE == 936、sizeof(NOTIFYICONDATAW)を使用すると952が返されます。 _WINN32_WINNTを0x0500(win2k)に定義し、NOTIFYICONDATAW_V2_SIZE(win2k以降)を使用しようとするとShellAPI.hにバグがあります。「エラーC2039: 'guidItem': '_NOTIFYICONDATAW'のメンバーではありません」 。それを修正するには、cbSizeを設定するときにNOTIFYICONDATAW_V2_SIZEの値をハーコードする必要があります。 –

1

あなたはEnableBalloonTipsのために... ...

ます。HKEY_CURRENT_USER \ Software \ Microsoft \ Windowsの\ CurrentVersionの\ Explorerの\詳細は

下のレジストリで確認しましたか?ユーザーがオフにするのは非常に一般的なことです。

+1

私はその鍵を探しましたが、私のマシンには存在しません。 –

+0

詳細については、このページを参照してください:http://www.howtogeek.com/howto/windows-vista/disable-all-notification-balloons-in-windows-vista/ – mobiGeek

1

ユーザーがアイコンをクリックしたときにWindowsがWM_LBUTTONDOWNを送信しようとしていると仮定していますが、それは正しくありません。 WM_LBUTTONDOWNは、ユーザーがhWndのクライアント領域内をクリックしたときにのみ送信されます。NOTIFYICONDATAのドキュメントを慎重に読んだ場合、ユーザーがアイコンをクリックすると、WindowsはWM_USER+20メッセージ(コードに従って)とlParamパラメーターWM_LBUTTONDOWN通知が届きます。

関連する問題