gpt4 book ai didi

c++ - 关于 NOTIFYICONDATA 的 cbSize 成员的 MSDN 文档

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:21 26 4
gpt4 key购买 nike

我正在阅读 MSDN 中的 NOTIFYICONDATA 文档。

它说 NOTIFYICONDATA 结构有一个 cbSize 成员应该设置为该结构的大小,但是 NOTIFYICONDATA 结构的大小在每个 Shell32.dll 中都有不同的大小,所以你应该在设置 cbSize 之前获取 Shell32.dll 版本。

以下引自 MSDN:


如果是5.0以上版本,初始化cbSize成员如下。

nid.cbSize = sizeof(NOTIFYICONDATA);

将 cbSize 设置为此值可启用所有版本 5.0 和 6.0 的增强功能。对于早期版本,6.0 之前的结构的大小由 NOTIFYICONDATA_V2_SIZE 常量给出,而 5.0 之前的结构由 NOTIFYICONDATA_V1_SIZE 常量给出。按如下方式初始化 cbSize 成员。nid.cbSize = NOTIFYICONDATA_V2_SIZE;

将此值用于 cbSize 将允许您的应用程序将 NOTIFYICONDATA 与早期的 Shell32.dll 版本一起使用,尽管没有 6.0 版的增强功能。


我发现它有点含糊,因为“sizeof(NOTIFYICONDATA)”在 Win98(使用 Shell32.dll 版本 4.x)、Win2K(版本 5.0)和 WinXP(版本 6.0)中具有不同的值。它如何“启用所有版本 5.0 和 6.0 增强功能”?

于是我查找了NOTIFYICONDATA_V1_SIZE的定义(源码如下),我看到:

NOTIFYICONDATA_V1_SIZE 适用于 Win 2K(不包括 2K)

NOTIFYICONDATA_V2_SIZE 适用于 Win XP

NOTIFYICONDATA_V3_SIZE 适用于 Vista

(不知道我说的对不对)

和MSDN说的完全不一样?而 Win2K 没有吗?

所以,我现在完全糊涂了。如何根据Shell32.dll版本设置cbSize成员?

//= = = = = = = = ShellAPI.h = = = = = = = =

typedef struct _NOTIFYICONDATAA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
#if (NTDDI_VERSION < NTDDI_WIN2K)
CHAR szTip[64];
#endif
#if (NTDDI_VERSION >= NTDDI_WIN2K)
CHAR szTip[128];
DWORD dwState;
DWORD dwStateMask;
CHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion; // used with NIM_SETVERSION, values 0, 3 and 4
} DUMMYUNIONNAME;
CHAR szInfoTitle[64];
DWORD dwInfoFlags;
#endif
#if (NTDDI_VERSION >= NTDDI_WINXP)
GUID guidItem;
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
HICON hBalloonIcon;
#endif
} NOTIFYICONDATAA, *PNOTIFYICONDATAA;


typedef struct _NOTIFYICONDATAW {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
#if (NTDDI_VERSION < NTDDI_WIN2K)
WCHAR szTip[64];
#endif
#if (NTDDI_VERSION >= NTDDI_WIN2K)
WCHAR szTip[128];
DWORD dwState;
DWORD dwStateMask;
WCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion; // used with NIM_SETVERSION, values 0, 3 and 4
} DUMMYUNIONNAME;
WCHAR szInfoTitle[64];
DWORD dwInfoFlags;
#endif
#if (NTDDI_VERSION >= NTDDI_WINXP)
GUID guidItem;
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
HICON hBalloonIcon;
#endif
} NOTIFYICONDATAW, *PNOTIFYICONDATAW;


#define NOTIFYICONDATAA_V1_SIZE FIELD_OFFSET(NOTIFYICONDATAA, szTip[64])
#define NOTIFYICONDATAW_V1_SIZE FIELD_OFFSET(NOTIFYICONDATAW, szTip[64])
#ifdef UNICODE
#define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAW_V1_SIZE
#else
#define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAA_V1_SIZE
#endif


#define NOTIFYICONDATAA_V2_SIZE FIELD_OFFSET(NOTIFYICONDATAA, guidItem)
#define NOTIFYICONDATAW_V2_SIZE FIELD_OFFSET(NOTIFYICONDATAW, guidItem)
#ifdef UNICODE
#define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAW_V2_SIZE
#else
#define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAA_V2_SIZE
#endif


#define NOTIFYICONDATAA_V3_SIZE FIELD_OFFSET(NOTIFYICONDATAA, hBalloonIcon)
#define NOTIFYICONDATAW_V3_SIZE FIELD_OFFSET(NOTIFYICONDATAW, hBalloonIcon)
#ifdef UNICODE
#define NOTIFYICONDATA_V3_SIZE NOTIFYICONDATAW_V3_SIZE
#else
#define NOTIFYICONDATA_V3_SIZE NOTIFYICONDATAA_V3_SIZE
#endif

(好像代码在网站上看起来不太好,但是来自 ShellAPI.h,都一样)

最佳答案

哪些功能可通过平台 sdk header 获得,由 _WIN32_WINNT 控制,它应该定义为您所针对的操作系统的较低版本。

来自 http://msdn.microsoft.com/en-us/library/6sehtctf.aspx正确的值是:

0x0500 for Windows 2000 operating system, 0x0501 for Windows XP, 0x0502 for Windows Server 2003, and 0x0600 for Windows Vista.

所以 NOTIFYICONDATA_V1_SIZE 指的是任何低于 2K 的版本,NOTIFYICONDATA_V2_SIZE 指的是 2K,NOTIFYICONDATA_V3_SIZE 指的是 XP 而没有指代 Vista(在这种情况下你可以使用 sizeof(NOTIFYICONDATA))。

如果您编译项目时将 _WIN32_WINNT 设置为最新版本,并检测到您在运行时运行的 shell.dll 版本,您可以将 .cbSize 设置为正确的大小,其余的字段将被忽略。

像这样的东西应该可以工作:

NOTIFYICONDATA notify;
ZeroMemory(&notify, sizeof(notify));
if(version >= VISTA) {
notify.cbSize = sizeof(NOTIFYICONDATA);
}
else if(version >= XP) {
notify.cbSize = NOTIFYICONDATA_V3_SIZE;
}
else if(version >= 2K) {
notify.cbSize = NOTIFYICONDATA_V2_SIZE;
}
else {
notify.cbSize = NOTIFYICONDATA_V1_SIZE;
}

关于c++ - 关于 NOTIFYICONDATA 的 cbSize 成员的 MSDN 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/743732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com