【问题标题】:Display balloon tooltip in systemtray在系统托盘中显示气球工具提示
【发布时间】:2015-07-06 16:06:07
【问题描述】:

这是我的代码..

设置托盘图标 .......

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

.......

但是,不能显示气球工具提示

请教我。

【问题讨论】:

    标签: visual-c++ winapi


    【解决方案1】:

    您应该检查 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 如果版本是

    【讨论】:

    • 那么如何以编程方式知道版本?这样我就可以将它包装在 If else..
    • @Neel:链接的文档说明了如何使用 shell32 中的 DllGetVersion
    【解决方案2】:

    我发现官方文档中用于检测 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 部分,但我想这一定很接近。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      相关资源
      最近更新 更多