Win32 API检查当前窗口是否为对话框或普通窗口

3

我正在处理win32 api子类。我的问题是我不知道我的子类过程是否在对话框或“普通窗口”上运行。有人能告诉我如何确定当前窗口是对话框还是普通窗口吗?


3
为什么需要表现不同?对话框是窗口,因此适用于通用窗口的解决方案也适用于对话框。 - Raymond Chen
我想将一个结构体的指针传递给窗口,但如果它是对话框,则在SetWindowLong函数中使用DWL_USER,否则使用GWL_USERDATA。此时,我有些困惑,我的方法是否正确或者是否可以通过其他方式实现(例如,对话框中是否可用GWL_USERDATA)? - Bình Nguyên
2
你如何知道 GWL_USERDATADWL_USER 是安全可用的?如果窗口/对话框已经在使用它们进行其他操作,会怎么样? - Raymond Chen
2
GWL_USERDATA对话框也可用。 对话框具有与常规窗口完全相同的值(因为它们是窗口),只是添加了其他的DWL_Xxx值。但正如Raymond所说,GWL_USERDATA应该仅由创建窗口的应用程序使用。 您不能只是清除其他应用程序的私有数据。保存并尝试恢复它确实不是一个好的解决方案。您是如何/何时尝试传递此指针的?您可以发送窗口/对话框一条消息来替代吗? - Cody Gray
1
使用窗口属性或私有注册消息,将MSG打包在lParam中,将实例数据打包在wParam中。不要去搞别人的数据。(另外,如果有人向对话框发送消息怎么办?你的子类将访问DWL_USER,认为它是你的私有实例指针,但实际上并不是。结果:崩溃。) - Raymond Chen
显示剩余4条评论
1个回答

10

检查窗口类的名称。除此之外,没有正式记录的方法来确定这个。


6
请使用 RealGetWindowClass 并检查结果是否为字符串 #32770。不要使用 GetClassName,因为在某些情况下它无效。 - user541686
@Mehrdad:你应该把你的评论发布为答案。也许我应该撤销我的错误答案,只是为了展示你的评论? - CapelliC
@chac:不,我觉得没问题;不过还是谢谢你的建议。 - user541686

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接