标准 Windows 消息框图标在不同版本的 Windows 中已多次更改。它们包含在几个系统 DLL 文件中,但您不应该尝试自己动态提取它们。正如我在对另一个答案的评论中提到的那样,ID 号没有记录是有原因的:即因为它们有可能在未来的 Windows 版本甚至未来的 Windows 更新中发生变化。也绝对没有理由去尝试提取它们。如果您问得好,Windows 已经为您为检索它们。
询问的好方法是使用LoadIcon function,并指定您想要的图标的IDI 标识符。 Windows 将返回一个HICON 值,或一个图标资源的句柄。
既然您提到您使用的是 VB.NET,您还可以使用 SystemIcons class,它具有返回任何常用图标的静态属性。这是一个 .NET 包装器,让您不必自己从 Windows API P/Invoke LoadIcon 函数。
更好的是,如果您只想显示一个包含其中一个图标的消息框,您只需拨打MessageBox API function。告诉 Windows 你想要的 MB_ICON 值,然后你就走了。和以前一样,.NET Framework 已经为您包装了同名的 MessageBox class。
这两个函数的好处是无论当前的 Windows 版本如何,它们都将始终返回正确的图标。试图澄清问题的评论似乎表明您想在当前版本的 Windows 上使用 old 图标。但是,当然,您不想这样做。图标已在整个 Windows shell 中进行了更新,这是有充分理由的,您的应用程序应该利用它们。新图标更清晰,更适合整体系统主题。此外,如果您的应用程序仍然使用旧图标,它会让用户感到困惑并且看起来非常不合适。 总是最好遵循标准的平台约定,而不是尝试做“其他事情”,即使您认为您的“其他事情”出于某种原因比平台默认设置“更好”。您的用户不会同意,您的应用程序将反映您的劣质工艺。
由于提出此类问题的人不可避免地不同意我的观点,并坚持他们必须无论如何都必须这样做,并且这是一个“要求”(无论是什么意思),我会指出旧图标在较新版本的 Windows 中不可用。出于某种原因,整个系统中的图标已被完全替换。许可协议也严格禁止从系统 DLL 文件中提取图标并将它们与您的应用程序一起重新分发。不要这样做。
此外,在决定应该在消息框中显示 哪个 图标之前,请务必查阅 Microsoft 的 Windows 用户体验交互指南,该指南提供了一些非常方便的规则来选择正确的图标来传达正确的信息并符合 Windows 语气。我在my answer here 中提供了更多信息;非常推荐任何 Windows 应用程序开发人员阅读。
编辑:这就像拔牙来了解这个问题的更多细节。我不确定你为什么对你想要完成的事情如此保密,但请注意,在未来,你将有更好的运气在你的问题中包括这些事情,而不是希望人们会把它从你身上拉出来。大多数人都没有我那么执着。
无论如何,您最后提到您正在 VB 6 代码和 .NET 代码之间进行某种类型的互操作。这与使用的消息框图标无关。 VB 6 MsgBox 函数 100% 等效于我之前讨论过的 Win32 API MessageBox 函数和 .NET MessageBox 类。它们都将使用当前的系统图标,并且不需要任何额外的工作来使它们看起来相同。确保您已将相同的图标说明符传递给所有函数。为方便起见,这里有一个表格:
VB 6 "MsgBox" Icon Constant | VB.NET "MessageBox" Icon Identifier
---------------------------------------------------------------------------------
vbCritical | MessageBoxIcon.Error
vbQuestion | MessageBoxIcon.Question (DEPRECATED -- do not use)
vbExclamation | MessageBoxIcon.Warning
vbInformation | MessageBoxIcon.Information
请注意,“问题”样式图标已被弃用,您不应使用此值。如果您仍在 VB 6 代码中使用它,您应该更改该代码以使用不同的图标(或根本没有图标)。上面链接的 Windows 用户体验交互指南提供了有关此图标已被弃用的原因以及如何选择合适的替代品的更多详细信息。