在这里您可以找到一个很好的答案:
http://blogs.msdn.com/b/oldnewthing/archive/2005/07/08/436815.aspx
这就像在问,“给定一盘食物,我该如何恢复
食谱的原始食谱和页码?”通过做化学
分析食物,你也许可以恢复“一个”食谱,但是
食物本身并没有说:“我来自
烹饪,第 253 页。”
所以答案是微软没有提供获取对话框ID的方法。他们本可以轻松地将其存储在任何地方以使其可用,但他们没有。
但仍有办法做到这一点,尽管它不是防弹的。你可以:
1.) 通过GetWindowModuleFileName()获取对话框的创建者文件
2.) 通过 LoadLibraryEx(..., LOAD_LIBRARY_AS_IMAGE_RESOURCE) 加载此 Exe 或 Dll
3.) 通过 EnumResourceNames() 枚举 Exe 或 Dll 中的所有 RT_DIALOG 资源,其中对话框 ID 在名称中:ResourceName = MAKEINTRESOURCE(IDD_DIALOG_ID)
4.) 通过LoadResource()、LockResource()、CreateDialogIndirect() 不可见地创建每个枚举对话框,但不显示带有ShowWindow() 的对话框。
5.) 通过EnumChildWindows() 枚举每个对话框中的子控件并将它们与您的对话框进行比较。
6.) 释放所有句柄并销毁对话框。
在一个 Exe/Dll 文件中不太可能有两个相同的对话框。但问题是,在WM_INITDIALOG 中,程序员可能会消除(销毁)或添加或修改子控件。所以你的搜索算法必须是容错的。这可以通过计算资源中的每个对话与您的对话之间的一致性来实现。您可以计算有多少子控件 ID (GetDlgCtrlID()) 和类名 (GetClassName()) 匹配。 (例如 Class="BUTTON" 和 ID = 311")虽然程序员可以轻松更改控件的文本或移动它,但更改 ID 的可能性不大,并且没有多大意义,更改子控件的类甚至是不可能的。
正如我所说:这不是万无一失的,但您会发现最有可能用于创建对话框的资源的 ID。
请注意,并非所有对话框都来自 Microsoft 资源。
它们可以由使用自己的模板类型的 GUI 框架创建。在这种情况下,您将永远找不到对话框 ID,因为它根本不存在。