关闭窗口忽略WM_CLOSE?

时间:2016-11-21 01:21:44

标签: c# windows winapi

我想从我的应用关闭一些应用程序的窗口。我尝试将NSButtonCell消息发送到该窗口(并且它对某些窗口非常有效),但有些窗口忽略WM_CLOSE。然后我发现this文章说如果我要关闭窗口,我可以调用WM_CLOSE WINAPI函数。但是,根据documentation,"线程不能使用DestroyWindow来销毁由不同线程创建的窗口"。所以我不能在我的应用程序中使用它关闭另一个应用程序的窗口。

所以我的问题是 - 是否可以关闭应用程序窗口,忽略DestroyWindow消息?我确实想要关闭窗口(例如弹出窗口),不要退出应用程序,不要关闭与该窗口相关的线程等等。

修改: 我肯定知道,那个窗口故意忽略了我的WM_CLOSE,因为我通过spy ++看到它收到了我的WM_CLOSE消息。而且我不想实现"点击右上角[X]按钮",因为我想要统一的解决方案(我有问题的窗口根本没有按钮[X])。

2 个答案:

答案 0 :(得分:1)

WM_CLOSE是关闭遵循标准规则的窗口的标准方法。显然,您的目标窗口没有,因此标准解决方案将无效。

但是,有一种可能的选择。正如您已经发现的那样,只有拥有窗口的线程才能破坏窗口。所以你必须让所有者线程破坏窗口。您可以使用GetWindowThreadProcessId()来获取目标窗口的拥有线程ID,然后使用SetWindowsHookEx()在该线程中安装特定于线程的消息钩子(钩子回调必须在DLL中实现),然后最后发送自定义窗口消息到目标窗口。当消息钩子收到消息时,它将在窗口拥有线程的上下文中运行,因此可以破坏窗口。

答案 1 :(得分:-2)

窗口忽略WM_CLOSE的原因有几个:

  1. 窗口可能故意忽略WM_CLOSE,因为它自己的逻辑认为窗口无法关闭。 (例如,它仍然在等待用户在所有编辑字段中输入文本)。如果您强制关闭窗口,则可能会在应用程序本身中导致未定义的行为。

  2. 您没有说出如何获得有问题的窗口句柄(HWND)。这可能值得研究,因为您的代码可能存在错误。

  3. 作为最后的手段,您始终可以实现将鼠标光标移动到窗口右上角的代码,并在[X]关闭按钮顶部模拟鼠标单击。或者单击窗口将其置于前台并通过ALT+F4

    注入SendInput击键