删除一个HWND对象

6

我遇到这样一种情况:当我接收到一条消息时,我必须通过hWnd删除一个窗口。由于CreateWindowEx通过返回HWND创建一个对象,因此我应该能够删除一个窗口。

注:hWnd位于其他进程中。


7
与其强制销毁它,不如与另一个进程合作,一起摧毁窗口,这样另一个进程就可以进行适当的清理。否则就像没有许可拆除别人的房子。 - Raymond Chen
2个回答

7

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

线程不能使用DestroyWindow来销毁由另一个线程创建的窗口。

WM_CLOSE和WM_DESTROY之间的区别:

发送WM_CLOSE后,目标应用程序可以通过处理WM_CLOSE消息并仅在用户确认选择后调用DestroyWindow函数来提示用户确认关闭窗口。

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

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

无论是哪个进程,只要使用WM_CLOSE消息,就不重要谁拥有窗口。

6
如果你想要强制删除一个窗口对象,就不应该发送 WM_DESTROY 消息。相反,应该调用 DestroyWindow 函数。 - tenfour
-1 只有创建窗口的线程才能在其上调用 DestroyWindow()。这在 DestroyWindow() 文档中已经明确说明。OP 表示,所涉及的 HWND 属于不同的进程。 - Remy Lebeau
1
发送WM_DESTROY消息并不会销毁窗口,它只是恶作剧式地模拟警察对窗口进行“骚扰电话” - Raymond Chen

3

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


如果hWnd来自不同的进程,这个工作还能行吗? - user1151738

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