【发布时间】:2012-09-14 15:38:35
【问题描述】:
我有一种情况,当我收到一条消息时,我必须从 hWnd 中删除一个窗口。我虽然这必须是可能的,因为CreateWindowEx 通过返回 HWND 创建一个对象,但我必须能够删除一个。
注意:hWnd 位于其他进程上。
【问题讨论】:
-
与其强行销毁,不如配合其他进程销毁窗口,以便其他进程进行适当的清理。否则就像擅自拆别人的房子一样。
我有一种情况,当我收到一条消息时,我必须从 hWnd 中删除一个窗口。我虽然这必须是可能的,因为CreateWindowEx 通过返回 HWND 创建一个对象,但我必须能够删除一个。
注意:hWnd 位于其他进程上。
【问题讨论】:
正确的方法是将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。
DestroyWindow()。这在DestroyWindow() 文档中有明确说明。 OP表示有问题的HWND属于不同的进程。
WM_DESTROY 消息不会破坏窗口。它只是prank-calls the window pretending to be the police。
使用SendMessage 向窗口发送WM_CLOSE 消息。
【讨论】: