使用 C# 结束任何具有系统菜单的应用程序






2.62/5 (10投票s)
本文使用 Windows API 来终止任何具有系统菜单的应用程序
引言
本文使用 Windows API 来结束在 Windows 环境下运行的应用程序。因此,我们将看到如何从非托管库导入函数到托管应用程序。为了简化在程序中使用平台调用的过程,我们将创建一个名为 Win32
的类,该类将包含所有本机声明。
使用 C#,我们可以使用 Microsoft Windows API SendMessage
函数来关闭具有“关闭”选项的系统菜单的任何活动窗口。下图 1 显示了计算器应用程序的系统菜单。
图 1. 显示系统菜单。
详细说明
在我们的 Kill 应用程序示例中,我们将使用 SendMessage
函数向环境中任何窗口发送消息,前提是知道该窗口的句柄。要获取句柄,我们可以使用 FindWindow
函数,该函数将确定与用户想要关闭的窗口关联的句柄。
为了使用 FindWindow
,您必须知道该窗口的类名或标题(如果有)。可以使用 Visual Studio .Net 工具中提供的 Microsoft Spy++ 工具获取有关类名或标题的信息。下图 2 显示了 Spy++ 工具的工作原理。
图 2. 显示 Microsoft Spy++ 工具的使用方法。
因此,让我们检查一下 Win32
类,该类具有所有平台调用声明。这个类将简单地将我们应用程序所需的所有函数分组在一起。
public class Win32
{
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_CLOSE = 0xF060;
[DllImport("user32.dll")]
public static extern int FindWindow(
string lpClassName, // class name
string lpWindowName // window name
);
[DllImport("user32.dll")]
public static extern int SendMessage(
int hWnd, // handle to destination window
uint Msg, // message
int wParam, // first message parameter
int lParam // second message parameter
);
}
在 C# 中,DllImport
属性用于标识包含导出函数的实际 DLL 的名称。为了应用该属性,该方法必须定义为静态和外部的。
我们将会在 Kill 应用程序的按钮单击事件中调用上述类的方法。以下是代码片段:
private void button1_Click(object sender, System.EventArgs e)
{
// Determine the handle to the Application window.
int iHandle=Win32.FindWindow(txtClsNm.Text ,txtWndNm.Text);
// Post a message to Application to end its existence.
int j=Win32.SendMessage(iHandle, Win32.WM_SYSCOMMAND,
Win32.SC_CLOSE, 0);
}
图 3. Kill 应用程序向计算器应用程序发送“关闭消息”。