【问题标题】:Win32 API check if current window is dialog or normal windowWin32 API 检查当前窗口是对话框还是普通窗口
【发布时间】:2012-08-08 20:23:22
【问题描述】:

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

【问题讨论】:

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

标签: c++ c api winapi


【解决方案1】:

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

【讨论】:

  • @BìnhNguyên:使用RealGetWindowClass 并检查结果是否为字符串#32770Don't use GetClassName,因为它在某些情况下不起作用。
  • @Mehrdad:谢谢,我现在试试;)
  • @Mehrdad:您应该发布您的 cmets 作为答案。也许我应该取消删除我的错误答案,唯一的目的是显示您的评论?
  • @chac:不,我认为这很好;不过感谢您的建议。
猜你喜欢
  • 2015-10-13
  • 2021-09-13
  • 1970-01-01
  • 2023-02-08
  • 2021-09-21
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多