Показывать всплывающую подсказку в системном трее - PullRequest
0 голосов
/ 12 сентября 2009

это мой код ..

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

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);

.......

но всплывающая подсказка не отображается

Пожалуйста, научите меня.

Ответы [ 2 ]

3 голосов
/ 12 сентября 2009

Вам следует проверить версию shell32.dll и установить для cbSize значение (как описано в разделе «Примечания» документа NOTIFYICONDATA ):

  • 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) </li>
0 голосов
/ 18 ноября 2012

Я обнаружил, что код в официальных документах для определения версий 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);
}

Затем, когда вы хотите установить значок, вы можете проверить правильность версии Windows. По какой-то причине в официальных документах они проверяли только версию 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, но я предполагаю, что это должно быть близко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...