2009-09-12 2 views
0

это мой код ..Показать баллон подсказке в SystemTray

комплект TrayIcon .......

NOTIFYICONDATA data;//this is global variable. 
case WM_CREATE : 
data.cbSize = sizeof(NOTIFYICONDATA); 
data.hWnd =hWnd; 
data.uID = IDR_MAINFRAME; 
data.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
data.uCallbackMessage = ID_TRAYICON_NOTIFY; 
data.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_INFO)); 

wcscpy_s(data.szTip,128,a); 

Shell_NotifyIcon(NIM_ADD, &data); 

........

и установить воздушный шар ......

case WM_RBUTTONDBLCLK: 
data.hWnd = hWnd; 
data.cbSize =sizeof(NOTIFYICONDATA); 
data.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_INFO)); 
data.uTimeout = 5000; 
data.uFlags = NIF_INFO; 
data.dwInfoFlags = NIIF_INFO; 
_tcscpy_s(data.szInfoTitle,_T("TITLE")); 
_tcscpy_s(data.szInfo,_T("SOME TEXT")); 
Shell_NotifyIcon(NIM_MODIFY,&data); 

.......

но, не может показать всплывающую подсказку всплывающего окна

PLZ научите меня.

ответ

3

Вы должны проверить shell32.dll версию и установить cbSize к (как описано в разделе Замечания of the NOTIFYICONDATA docs):

  • sizeof(NOTIFYICONDATA) если версия> = 6.0.6
  • NOTIFYICONDATA_V3_SIZE если версия 6.0 (WinXP)
  • NOTIFYICONDATA_V2_SIZE, если версия 5.0 (Win2000)
  • NOTIFYICONDATA_V1_SIZE, если версия < 5.0 (NT4/95/98)
+0

Ну как узнать версию программно? Так что я могу обернуть его в If else .. –

+0

@Neel: связанные документы говорят, как - используйте [DllGetVersion] (http://msdn.microsoft.com/en-us/library/bb776404%28v=VS.85%29 .aspx) из shell32. –

0

Я нашел код в официальных документах для обнаружения версий Windows не совсем прав. Это должно работать лучше:

Попробуйте это для размера (в буквальном смысле):

BOOL CheckWindowsVersion(DWORD dwMajor, DWORD dwMinor, DWORD dwBuild) 
{ 
    // Initialize the OSVERSIONINFOEX structure. 
    OSVERSIONINFOEX osvi; 
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 
    osvi.dwMajorVersion = dwMajor; 
    osvi.dwMinorVersion = dwMinor; 
    osvi.dwBuildNumber = dwBuild; 

    // Initialize the condition mask. 
    DWORDLONG dwlConditionMask = 0; 
    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); 
    VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); 
    VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL); 


    // Perform the test. 
    return VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, dwlConditionMask); 
} 

Затем, когда вы хотите установить значок, который вы можете проверить для правильной версии окон. По какой-то причине в официальных документах они проверяли только на 6.1, когда он должен быть 6.0.6 + все остальные версий Windows ...

if(CheckWindowsVersion(6, 0, 6)) 
    data.cbSize = sizeof(NOTIFYICONDATA); 
else if(CheckWindowsVersion(6, 0, 0)) 
    data.cbSize = NOTIFYICONDATA_V3_SIZE; 
else if(CheckWindowsVersion(5, 0, 0)) 
    data.cbSize = NOTIFYICONDATA_V2_SIZE; 
else 
    data.cbSize = NOTIFYICONDATA_V1_SIZE; 

Я не в полной мере испытать часть VER_BUILDNUMBER, но я предположим, что это должно быть близко.

Смежные вопросы