如何按名称关闭窗口?

时间:2012-02-12 11:33:01

标签: c# winapi

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

2 个答案:

答案 0 :(得分:27)

是的,您应该导入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);

答案 1 :(得分:1)

您尝试关闭属于其他进程的Windows。这并不是你可以假设可靠的东西。首先,你没有拥有这些窗户,所以你真的没有任何自动权利可以去处理其他流程&#39;窗户。

正如另一个答案建议的那样,你可以尝试向窗口发送一个WM_CLOSE,但它附带了一个警告,即另一个进程并没有真正有权获得它。对WM_CLOSE的响应可以是接受和彻底拒绝的干净关闭。在后一种情况下,你真的没有选择。这不是你的过程。在您之间,正如您所见,可能存在您不得不应对的任何类型的中间窗口,对话框等。

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