我正在使用并改进一个名为FFC的开源MFC类似于工作的库。有时,库将错误的窗口句柄关联到对话框对象,这意味着以后查找正确的句柄时无法找到C++对象。特别是,当应用程序打开它的根窗口时就会发生这种情况,这是一个通过调用DoModal打开的对话框。
在其DoModal函数中,FFC库使用...将句柄附加到对话框对象的“令人惊讶的”方式。它将"this“指针隐藏在一个全局变量中,并在调用DialogBox函数之前挂钩要在所有窗口消息上调用的函数。它在term中注册的钩子函数假定它收到的第一条消息中的句柄是全局变量中窗口的句柄,并将该句柄附加到该句柄上。
有时,这是可行的。通常-我不知道是因为我的工作计算机上的McAfee扫描器做了侵入性的事情,还是因为我的程序从控制台窗口启动,或者其他什么-许多不相关的消息会在实际用于模式对话框的消息到达之前被捕获。
起初,我认为这是因为FFC不能确保它查找的消息是"WM_CREATE“。我添加了这个检查,但是它没有解决这个问题。原来一个或多个虚假消息也是WM_CREATE消息!在获取实际对话框的句柄之前,它收到的第一个WM_CREATE是一个包含空白窗口文本和矩形0,0-0,0的窗口的句柄。
那么,这真的是获取模式对话框句柄的正确或规范的方法吗?这似乎不可靠。(请注意,因为该对话框是模式对话框,所以不能使用CreateWindowEx的返回值,因为DialogBox函数直到关闭模式对话框才会返回。)MFC真的是这样做的吗?有没有更好的方法?我是否可以将一些数据与对话框关联,或者查找应该与其关联的数据,以确保我拥有正确的窗口句柄?(例如,检查传递给对话框调用的模板参数,如果我能以某种方式从句柄中得到它的话。)
发布于 2016-07-01 06:43:50
我确信这是在书中发布的,但是MFC设置了一个窗口钩子(WH_CBT),然后在钩子中寻找HCBT_CREATEWND代码,以便将C++对象与HWND结合起来。
https://stackoverflow.com/questions/38132712
复制相似问题