2009-04-22 7 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

BTW, 이것은 XP에서이며 DllGetVersion()은 6.0을 반환합니다. –

답변

12

바하마, 알아 냈어. I 가지고있는 헤더 어떤 이유로 ...

를 sizeof (NOTIFYICONDATA) == 508 반면

...

NOTIFYICONDATA _ V3 _ 크기 == 504
NOTIFYICONDATA _ V2 _ SIZE = 들어 = 488
NOTIFYICONDATA _ V1 _ 크기 == 88

나는 풍선 도움말을 보여 V2 또는 대신 sizeof 연산자의 V3 (NOTIFYICONDATA) 중 하나를 지정하는 경우 괜찮아.

+3

그 사람에게 시가를주십시오. 너 아마 2 시간 만 구할거야. 당신이 대답을 얻을 수 있도록 올바른 답변을 표시하십시오! –

+0

유니 코드의 경우 : NOTIFYICONDATAW_V2_SIZE == 936, sizeof (NOTIFYICONDATAW)를 사용하면 952를 반환합니다. Btw. ShellAPI.h에 _WINN32_WINNT를 0x0500 (win2k)으로 정의하고 NOTIFYICONDATAW_V2_SIZE (win2k 이상)를 사용하려고하면 오류가 발생합니다. "오류 C2039 : 'guidItem': '_NOTIFYICONDATAW'의 구성원이 아닙니다." . 이 문제를 해결하려면 cbSize를 설정할 때 NOTIFYICONDATAW_V2_SIZE 값을 harcode해야합니다. 936을 사용하십시오. –

1

당신은 EnableBalloonTips로에 대한 ...

HKEY_CURRENT_USER \ SOFTWARE \ 마이크로 소프트 \ 윈도우 \ 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 알림이 표시됩니다.

관련 문제