【问题标题】:Delete an HWND object删除 HWND 对象
【发布时间】:2012-09-14 15:38:35
【问题描述】:

我有一种情况,当我收到一条消息时,我必须从 hWnd 中删除一个窗口。我虽然这必须是可能的,因为CreateWindowEx 通过返回 HWND 创建一个对象,但我必须能够删除一个。

注意:hWnd 位于其他进程上。

【问题讨论】:

  • 与其强行销毁,不如配合其他进程销毁窗口,以便其他进程进行适当的清理。否则就像擅自拆别人的房子一样。

标签: c++ c winapi hwnd


【解决方案1】:

正确的方法是将WM_CLOSE 消息发送到关联的窗口,或者简单地调用DestroyWindow,它将WM_DESTROY 消息发送到窗口。

线程不能使用 DestroyWindow 销毁由不同线程创建的窗口。

WM_CLOSE 和 WM_DESTROY 的区别:

发送 WM_CLOSE 后,目标应用程序可以在销毁窗口之前提示用户确认,方法是处理 WM_CLOSE 消息并仅在用户确认选择时调用 DestroyWindow 函数。

换句话说,可以拒绝使用 WM_CLOSE 关闭窗口,但它被认为比 WM_DESTROY“更安全”,因为应用程序可以保存请求确认并保存更改。 但是,如果您需要强制关闭,请使用 WM_DESTROY。

HWND 结构体指针由系统管理,千万不要尝试删除它们!

如果使用 WM_CLOSE 消息,哪个进程拥有窗口无关紧要。

【讨论】:

  • 您不应发送WM_DESTROY。如果要强制删除窗口对象,请调用DestroyWindow
  • -1 只有创建窗口的线程才能在其上调用DestroyWindow()。这在DestroyWindow() 文档中有明确说明。 OP表示有问题的HWND属于不同的进程。
  • 发送WM_DESTROY 消息不会破坏窗口。它只是prank-calls the window pretending to be the police
【解决方案2】:

使用SendMessage 向窗口发送WM_CLOSE 消息。

【讨论】:

  • 如果 hWnd 来自不同的进程,同样的工作吗?
猜你喜欢
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2014-08-14
  • 2011-06-06
  • 2016-01-03
相关资源
最近更新 更多