为什么Shell_NotifyIcon气球提示工作? [英] Why aren't Shell_NotifyIcon balloon tips working?

查看:281
本文介绍了为什么Shell_NotifyIcon气球提示工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据我看到的一切,当我在应用程序窗口中单击左键时,下面的C ++程序应该从托盘图标显示一个气球工具提示,但它不工作。任何人都可以告诉我我丢失了什么?

According to everything I've seen, the following C++ program should be displaying a balloon tool tip from the tray icon when I left-click in the application window, yet it's not working. Can anyone tell me what I'm missing?

这是在XP上与6.0版Shell32.dll(用DllGetVersion验证)。

This is on XP with version 6.0 of Shell32.dll (verified with DllGetVersion).

谢谢!

	#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;
	}


推荐答案

。由于某些原因,我有...

Bah, I figured it out. For some reason with the headers I have...

sizeof(NOTIFYICONDATA)== 508

sizeof(NOTIFYICONDATA) == 508

..

NOTIFYICONDATA _ V3 _ SIZE == 504

NOTIFYICONDATA _ V2 _ SIZE == 488

NOTIFYICONDATA _ V1 _ SIZE == 88

NOTIFYICONDATA_V3_SIZE == 504
NOTIFYICONDATA_V2_SIZE == 488
NOTIFYICONDATA_V1_SIZE == 88

如果我指定V2或V3而不是sizeof(NOTIFYICONDATA),气球提示就显示得很好。

If I specify either V2 or V3 instead of sizeof(NOTIFYICONDATA) the balloon tips show up just fine.

这篇关于为什么Shell_NotifyIcon气球提示工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆