在ResourceHacker中,当您打开可执行文件(窗口)时,您可以看到与对话框关联的标识符.有没有人知道他们来自哪里?我的意思是,我怎样才能在我的C++程序中从HWND获取ID?
BTW,GetWindowLong(hwnd,GWL_ID)返回0.
谢谢
rod*_*igo 12
该GetWindowLong(hwnd, GWL_ID)收益在对话框控制的标识符,但不能用于对话框本身,因为对话根本没有标识.
与对话框关联的标识符实际上用于引用资源blob本身,而不是窗口.它们用于创建对话框(请参阅CreateDialog().
创建对话框后,与原始模板或该标识符无关.实际上该ID没有用处,对话框只是由它识别HWND.请注意,您可以使用相同的对话框资源创建多个不同的对话框.
这些标识符(通常)由资源编辑器按顺序分配,或者手动创建资源时手动分配.
有关该主题的更多信息,您可以阅读有关CreateDialogIndirect()函数的信息,该函数可在不使用资源的情况下创建对话框.
在这里您可以找到一个很好的答案:http: //blogs.msdn.com/b/oldnewthing/archive/2005/07/08/436815.aspx
这就像是在问:"鉴于一盘食物,我如何恢复食谱的原始食谱和页码?" 通过对食物进行化学分析,你可能能够恢复"一种"食谱,但食物中没有任何东西可以说"我来自烹饪的喜悦,第253页".
所以答案是微软没有提供获取对话框ID的方法.他们可以轻松地将它存储在任何地方以使其可用,但他们没有.
但是仍然有办法实现它,尽管它不是防弹的.你可以:
1.)通过获取对话框的创建者文件 GetWindowModuleFileName()
2.)通过加载此Exe或Dll LoadLibraryEx(..., LOAD_LIBRARY_AS_IMAGE_RESOURCE)
3.)通过EnumResourceNames()对话框ID在名称中的位置枚举Exe或Dll中的所有RT_DIALOG资源: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框架创建.在这种情况下,您永远不会找到Dialog ID,因为它根本不存在.
| 归档时间: |
|
| 查看次数: |
8508 次 |
| 最近记录: |