65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.62/5 (10投票s)

2002年11月18日

CPOL

2分钟阅读

viewsIcon

117403

downloadIcon

2468

本文使用 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 应用程序向计算器应用程序发送“关闭消息”。

有关平台调用的更多阅读

© . All rights reserved.