【发布时间】:2012-08-08 20:23:22
【问题描述】:
我正在处理 win32 api 子类。我的问题是我不知道我的子类过程是在对话框或“普通窗口”上运行的。谁能告诉我如何确定当前窗口是对话框还是普通窗口?
【问题讨论】:
-
为什么你需要采取不同的行为方式?对话框是窗口,所以一般窗口的解决方案也应该适用于对话框。
-
我想将一个结构的指针传递给那个窗口,但如果它的对话框那么我在
SetWindowLong函数中使用DWL_USER否则是GWL_USERDATA。在这一点上我很困惑我的方式是正确的还是可以通过其他方式完成(例如GWL_USERDATA在对话框中可用)? -
您怎么知道
GWL_USERDATA和DWL_USER可以安全使用?如果窗口/对话框已经将其用于其他目的怎么办? -
GWL_USERDATA也可用于对话。对话框具有与常规窗口相同的所有值(因为它们是窗口),它们只是添加了额外的DWL_Xxx值。但就像 Raymond 所说,GWL_USERDATA应该只由创建窗口的应用程序使用。您不能只清除其他一些应用程序的私有数据。保存并尝试恢复它确实不是一个好的解决方案。您如何/何时尝试传递此指针?您可以向窗口/对话框发送消息吗? -
使用窗口属性或私有注册消息,在 lParam 中打包 MSG,在 wParam 中打包实例数据。不要去弄乱别人的数据。 (除了如果其他人向对话框发送消息怎么办?您的子类将访问 DWL_USER 认为它是您的私有实例指针,但事实并非如此。结果:crash-o-rama。)