我想关闭带有某个名称的窗口(任何应用程序,例如计算器等)。如何在C#中做到这一点?导入WinAPI函数?
答案 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的响应可以是接受和彻底拒绝的干净关闭。在后一种情况下,你真的没有选择。这不是你的过程。在您之间,正如您所见,可能存在您不得不应对的任何类型的中间窗口,对话框等。
那么你想在这里实现什么?你为什么要关闭属于其他进程的窗口?它可能有助于澄清目标是什么。