C# 关闭忽略WM\U关闭的窗口?

C# 关闭忽略WM\U关闭的窗口?,c#,windows,winapi,C#,Windows,Winapi,我想从我的应用程序关闭某些应用程序的窗口。我曾尝试将WM\u CLOSE消息发送到该窗口(它在某些窗口中非常有效),但有些窗口忽略了WM\u CLOSE。然后我发现一篇文章说,若我想关闭窗口,我可以调用destronWindowWINAPI函数。但是,根据“一个线程不能使用DestroyWindow来破坏另一个线程创建的窗口”。因此,我无法从我的应用程序中使用它来关闭其他应用程序的窗口 所以我的问题是-是否可以关闭忽略WM\u close消息的应用程序窗口?我确实希望关闭窗口(例如弹出窗口),不

我想从我的应用程序关闭某些应用程序的窗口。我曾尝试将
WM\u CLOSE
消息发送到该窗口(它在某些窗口中非常有效),但有些窗口忽略了
WM\u CLOSE
。然后我发现一篇文章说,若我想关闭窗口,我可以调用
destronWindow
WINAPI函数。但是,根据“一个线程不能使用
DestroyWindow
来破坏另一个线程创建的窗口”。因此,我无法从我的应用程序中使用它来关闭其他应用程序的窗口

所以我的问题是-是否可以关闭忽略
WM\u close
消息的应用程序窗口?我确实希望关闭窗口(例如弹出窗口),不退出应用程序,不关闭与该窗口相关的线程,等等

编辑
我确信,当我通过spy++看到它接收到我的
WM_CLOSE
消息时,该窗口故意忽略我的
WM_CLOSE
。我不想实现“单击右上角[X]按钮”,因为我想要统一的解决方案(有问题的窗口根本没有按钮[X])。

该窗口忽略您的WM\u关闭有几个原因:

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

  • 您没有说明如何获得所讨论的窗口句柄(HWND)。这可能值得研究,因为您的代码可能有bug


  • 最后,您可以实现将鼠标光标移动到窗口右上角并模拟鼠标单击
    [X]
    关闭按钮顶部的代码。或者单击该窗口将其置于前台,并通过
    SendInput
    WM\u CLOSE
    插入一个
    ALT+F4
    按键,这是按照标准规则关闭窗口的标准方法。显然,您的目标窗口没有,因此标准解决方案将不起作用


    不过,有一个可能的替代方案。正如您已经发现的,只有拥有该窗口的线程才能破坏该窗口。因此,您必须让所有者线程破坏窗口。您可以使用
    GetWindowThreadProcessId()
    获取目标窗口所属的线程ID,然后使用
    SetWindowsHookEx()
    将特定于线程的消息挂钩安装到该线程中(挂钩回调必须在DLL中实现),最后向目标窗口发送自定义窗口消息。当消息挂钩收到消息时,它将在窗口所属线程的上下文中运行,因此可能会破坏窗口。

    抱歉,意外按下enter键。1.我确信,当我通过spy++看到它接收到我的
    WM_CLOSE
    消息时,该窗口故意忽略我的
    WM_CLOSE
    。此窗口右上角没有[X]关闭按钮,此窗口有自己的“关闭”按钮(不在右上角)。但我需要统一的解决方案,它将适用于所有可能的窗口。2.我通过
    SetWinEventHook
    函数获取窗口句柄(查找
    EVENT\u OBJECT\u CREATE
    EVENT)。我可以验证句柄是正确的,因为我也用spy++精确地检查了这一点,它是一个自定义窗口,有自己的逻辑来决定如何销毁自己。在这种情况下,它很简单。您需要模拟用户单击该按钮。下一个投票者是否愿意解释他不喜欢的内容?@KtulhuGreen一个适用于“所有可能的窗口”的解决方案是不可能的。@selbie:因为您建议的解决方案不适用于带有照明符号而不是关闭按钮的自定义画框的虚拟应用程序,所以点击这个“毁灭宇宙”,而不是关闭应用程序。现在严肃地说:如果我没记错,点击关闭按钮和/或按ALT+F4发送WM_关闭消息,那么您建议的解决方案是“不要发送WM_关闭,您必须发送WM_关闭”