捕获新创建的模式对话框的窗口句柄

时间:2016-06-30 20:30:57

标签: c++ mfc dialog

我正在使用和改进名为FFC的开源MFC工作类库。有时库会将错误的窗口句柄与对话框对象关联,这意味着在查找正确的句柄时,以后找不到C ++对象。特别是,当应用程序打开其根窗口时会发生这种情况,该窗口是通过调用DoModal打开的对话框。

在其DoModal函数中,FFC库使用......“令人惊讶”的方式将句柄附加到对话框对象。它在全局变量中存储“this”指针,并在调用DialogBox函数之前挂钩要在所有窗口消息上调用的函数。它在术语中注册的这个钩子函数假定它接收的第一个消息的句柄是全局变量中窗口的句柄,并将该句柄附加到它。

有时,这有效。经常 - 而且我不知道是不是因为我的工作计算机上的McAfee扫描程序所做的侵入性事情,或者因为我的程序是从控制台窗口或其他东西启动的 - 在消息实际上意味着什么之前会捕获许多不相关的消息模态对话框通过。

起初我认为这是因为FFC没有确定它所寻找的消息是“WM_CREATE”。我添加了这个检查,但它没有解决问题。原来一个或多个虚假消息也是WM_CREATE消息!在获得真实对话框之前,它收到的第一个WM_CREATE是一个窗口的句柄,窗口为空白窗口,矩形为0,0-0,0。

这是获取模态对话框句柄的正确或规范方法吗?这似乎不可靠。 (请注意,因为对话框是模态的,所以不能使用CreateWindowEx的返回值,因为在模式对话框关闭之前DialogBox函数不会返回。)这是否真的是MFC的用途?有没有更好的办法?我可以将一些数据与对话框关联,还是查找应该与之关联的数据,以确保我有正确的窗口句柄? (例如,检查传递给对话框调用的模板参数,如果我可以以某种方式从句柄中获取它。)

1 个答案:

答案 0 :(得分:0)

我确信这是在书籍中发布的,但是MFC设置了一个Windows钩子(WH_CBT),然后在钩子中查找HCBT_CREATEWND代码以将C ++对象与HWND结合。