- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在阅读 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(¬ify, 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/
有人提出了类似的问题:MSDN subscriptions on the cheap? ,但我对提供的解决方案不感兴趣: 我不是在开发用于销售的产品,而是在创办一家咨询公司,因此 Empower 不是
我一直在 .NET 编程专业工作了三年,我一直在寻求磨砺我的工具。我是一家公司的独家开发人员,该公司最近购买了 MSDN 订阅以及 Visual Studio 2008专业的。订阅有哪些用处? 我习惯
有没有办法关闭MSDN 库页面的自动文本翻译? 我确实更喜欢英文文本,但由于拥有德语 IP 地址,微软会在每个新页面加载时激活自动翻译,这会给我一个黄色框,其中包含我当前用鼠标悬停在其上的文本的德语翻
我知道这个问题有点异端,但我很好奇...... 当然,也有特快版。但是,当微软在 OSS 世界中有效地争夺“人心”时,向全心全意支持 .NET 的开发人员收取高昂的微软软件订阅费似乎有点适得其反。很难
想知道这里是否还有其他人注册了相同的程序并可以给我一些建议。我在一两个月前的某个时候注册了 Microsoft BizSpark 计划,并激活了该计划附带的 MSDN 订阅。 在我登录到 MSDN 门
我一直被一个问题困扰:“Javadoc、Doxygen 等等……微软真的有可能不为其开发人员提供良好的文档生成器吗?”。它对我来说一直听起来很奇怪......也因为 Msdn 是一个非常好的文档排版.
我试图做一些遗留工作,并在 MSDN 上查找了 Visual C++ 6。我再也看不到它了,我能做的最好的是 Visual C++ 4.2! 有谁知道为什么会这样?有没有办法从 MSDN 获取它? 最
我升级到 Visual Studio 2010 RC,我记得为 MSDN 帮助改进事件填写了一个大表格,我想知道我会看到 Visual Studio 2008 中包含一个类似 MSDN 的帮助查看器,
我在一家小型数字营销公司工作,担任程序员,我们不是 Microsoft 合作伙伴或任何类型(金/银/铜)。但是,我们使用 .NET。 我感到困惑的是,我之前的开发人员已经离开,他获得了最新 Micro
首先,请不要以为这不是编程相关的问题,因为它非常重要。 当我在高中使用VB 6时,MSDN简直太棒了,我再也没有在其他地方寻求帮助。然后是整个.net和在线MSDN,什么也没有,并且不再有任何实际示例
我只是一个人的软件商店,并且目前有MSDN订阅。它即将更新,看起来好像要花一小笔钱。我看到TechNet订阅的费用大大减少,并且似乎包括所有相同的软件。我在这里想念什么吗?这两个软件包之间有什么区别?
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我知道这不完全是编程问题,但它是紧密相关的 - 到底如何设置 MSDN 以英文显示所有内容?我是捷克人,每一篇知识库或文档文章都会通过翻译器自动翻译为捷克语,这只会导致乱码,而将其切换为英语需要几次搜
我觉得问这个问题有点愚蠢,但我希望这对其他人也有帮助。 背景:我们/我正在使用Visual Studio 2008 SP1 (VC9)开发一些软件。我们希望随 CD 上的软件一起提供 vcredist
有没有办法以编程方式查询 MSDN.com?本质上,我有一个类名、命名空间或其他标识符,并希望找到 MSDN 文档页面,最好也传递一个版本(.net 3.5、.net 4.0、Silverlight
关闭。这个问题是 off-topic 。它目前不接受答案。 想改善这个问题吗? Update the question 所以它是堆栈溢出的 on-topic。 9年前关闭。 Improve this
我注意到 MSDN 在提及事件及其事件处理程序时多次使用“错误”术语。例如: The ProfileAutoSaving event is raised at the end of page exec
MSDN 订阅使开发人员可以访问 Visual Studio 2010 和最新的 Microsoft 平台进行开发和测试。 Microsft MSDN 订阅白皮书指出,通过“企业协议(protocol
今天在看MSDN的时候,遇到了如下代码: void draw( int I, long L ); long sq( int s ); int main() { long y; int x; y = s
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我是一名优秀的程序员,十分优秀!