我想关闭某些应用程序窗口(比如计算器等),该怎么在C#中实现?需要导入WinAPI函数吗?
我想关闭某些应用程序窗口(比如计算器等),该怎么在C#中实现?需要导入WinAPI函数吗?
是的,你应该导入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
以确保应用程序被关闭。 - Cody GrayWM_CLOSE
。例如,一些程序选择在接收到此消息时将自己最小化到任务栏的通知区域,而不是真正关闭。由于您无法控制应用程序对消息的响应方式,因此需要广泛测试此方法并意识到在处理未知和未经测试的应用程序时它可能是多么脆弱。 - Cody Gray你正在尝试关闭属于其他进程的窗口。这不是你可以假定会可靠进行的事情。首先,你不拥有那些窗口,所以你没有任何自动权利去干扰其他进程的窗口。
正如其他答案所建议的那样,你可以尝试向窗口发送WM_CLOSE消息,但它带有一个警告,即其他进程并没有真正有义务予以执行。对WM_CLOSE的响应可以是接受和干净的关闭,也可以是彻底拒绝。在后一种情况下,你真的没有选择。这不是你的进程。在中间,就像你已经看到的那样,可能会出现各种中间窗口、对话框等问题。
那么你在这里想要实现什么?为什么要尝试关闭属于其他进程的窗口?这可能有助于澄清目标。