如何按名称关闭窗口?

Posted

技术标签:

【中文标题】如何按名称关闭窗口?【英文标题】:How to close the window by its name? 【发布时间】:2012-03-04 03:24:32 【问题描述】:

我想用某个名称关闭窗口(任何应用程序,例如计算器等)。如何在 C# 中做到这一点?导入 WinAPI 函数?

【问题讨论】:

codeproject.com/Articles/22257/… ... google rox 你知道的 可能重复。 ***.com/questions/116090/… @Lloyd:不是重复的,杀死一个进程和关闭一个窗口是不一样的。 @CodyGray 我认为用户在谈论一个进程是因为他提到了“任何应用程序”。 【参考方案1】:

是的,您应该导入 Windows API 函数:FindWindow()SendMessage();和WM_CLOSE 常量。

Windows API 函数的原生定义:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

/// <summary>
/// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter.
/// </summary>
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

const UInt32 WM_CLOSE = 0x0010;

客户端代码:

IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad");
if (windowPtr == IntPtr.Zero)

    Console.WriteLine("Window not found");
    return;


SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);

【讨论】:

是的,这适用于记事本(当然,假设窗口标题正是您在此处给出的,但大多数情况下可能不是这样)。但它不适用于具有多个***窗口的应用程序,除非它们专门设计为在关闭单个***窗口后关闭整个应用程序。否则,您需要将WM_CLOSE 发送到每个 ***窗口,以确保应用程序被关闭。 此外,应用可以选择回复WM_CLOSE,但他们喜欢。例如,某些程序在收到此消息时选择将自身最小化到任务栏的通知区域,而不是实际关闭。由于您无法控制应用程序如何响应消息,因此您需要广泛测试此方法,并意识到在处理未知和未经测试的应用程序时它有多么脆弱。 @Artem:没有。​​你读过the documentation 的CloseWindow 功能吗?它最小化指定的窗口,即到任务栏。 @svick:我并没有不同意,事实上我赞成这个答案。但问题并不完全清楚。我只是在澄清重要的警告。 请注意,即使是记事本,您也会收到“您想将更改保存到...吗?”如果自上次保存后内容已更改,则对话框 - 与许多其他应用程序类似,每个应用程序都可能具有不同样式的确认对话框。此外,请注意 SendMessage:在某些应用程序中,它可能会阻塞,直到处理确认对话框 - 例如。如果目标应用程序在其 WM_CLOSE 处理程序中调用 MessageBox;如果您不想阻止,PostMessage 可能更安全。【参考方案2】:

您正在尝试关闭属于其他进程的窗口。这不是你可以假设会可靠的事情。一方面,您不拥有这些窗口,因此您实际上没有任何自动权利去干扰其他进程的窗口。

正如另一个答案所暗示的,您可以尝试将 WM_CLOSE 发送到窗口,但需要注意的是,其他进程实际上无权兑现它。对 WM_CLOSE 的响应可以是接受的任何内容,也可以是彻底拒绝的彻底关闭。在后一种情况下,你真的别无选择。这不是你的过程。正如您所见,在这两者之间,您可能需要处理任何类型的中间窗口、对话框等。

那么你想在这里实现什么?你为什么要关闭属于其他进程的窗口?这可能有助于澄清目标是什么。

【讨论】:

以上是关于如何按名称关闭窗口?的主要内容,如果未能解决你的问题,请参考以下文章

WPF学习笔记-如何按ESC关闭窗口

使用宏或 VBA 正确关闭 access 2003 中的隐藏窗口?

如何在窗口中显示文件夹中所有文件的名称? Qt C++ [关闭]

如何彻底关闭Win7系统的“粘滞键”窗口

JAVA的GUI中如何实现按下某个按钮后关闭当前窗口,打开新的窗口?

款式修改窗口,开发调整过窗口格局保存功能,关了窗口重新打开还是按关闭前的格局.