在GetProcessPID()方法中,修改进程名,就可以实现关闭窗体功能。
本程序经过.Net 4.0调试通过,操作系统平台Windows Server 2008 R2
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
// 获取窗口标题
[DllImport("user32", SetLastError = true)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount
);
//获取类的名字
[DllImport("user32.dll")]
private static extern int GetClassName(
IntPtr hWnd,
StringBuilder lpString,
int nMaxCount
);
//根据坐标获取窗口句柄
[DllImport("user32")]
private static extern IntPtr WindowFromPoint(
Point Point
);
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
// 隐藏窗口
public const int SW_HIDE = 0;
public const int SW_SHOWNORMAL = 1;
public const int SW_NORMAL = 1;
public const int SW_SHOWMINIMIZED = 2;
public const int SW_SHOWMAXIMIZED = 3;
public const int SW_MAXIMIZE = 3;
public const int SW_SHOWNOACTIVATE = 4;
public const int SW_SHOW = 5;
public const int SW_MINIMIZE = 6;
public const int SW_SHOWMINNOACTIVE = 7;
public const int SW_SHOWNA = 8;
public const int SW_RESTORE = 9;
public const int SW_SHOWDEFAULT = 10;
public const int SW_FORCEMINIMIZE = 11;
public const int SW_MAX = 11;
private void button2_Click(object sender, EventArgs e)
{
IntPtr formHandle = GetMainWindowHandle(GetProcessPID());
ShowWindow(formHandle, SW_HIDE);
}
private void button3_Click(object sender, EventArgs e)
{
IntPtr formHandle = GetMainWindowHandle(GetProcessPID());
ShowWindow(formHandle, SW_SHOW);
}
private static class NativeMethods
{
internal const uint GW_OWNER = 4;
internal delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern int GetWindowThreadProcessId(IntPtr hWnd, out IntPtr lpdwProcessId);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool IsWindowVisible(IntPtr hWnd);
}
/// <summary>
/// 通过进程PID取得窗体句柄
/// </summary>
/// <param name="processId"></param>
/// <returns></returns>
public static IntPtr GetMainWindowHandle(int processId)
{
IntPtr MainWindowHandle = IntPtr.Zero;
NativeMethods.EnumWindows(new NativeMethods.EnumWindowsProc((hWnd, lParam) =>
{
IntPtr PID;
NativeMethods.GetWindowThreadProcessId(hWnd, out PID);
if (PID == lParam &&
NativeMethods.IsWindowVisible(hWnd) &&
NativeMethods.GetWindow(hWnd, NativeMethods.GW_OWNER) == IntPtr.Zero)
{
MainWindowHandle = hWnd;
return false;
}
return true;
}), new IntPtr(processId));
return MainWindowHandle;
}
/// <summary>
/// 通过进程名取得进程PID
/// </summary>
/// <returns></returns>
private int GetProcessPID()
{
try
{
//进程名称不要加上.exe
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("communicator");
if (processes != null && processes.Length != 0)
{
return processes[0].Id;
}
throw new Exception();
}
catch (Exception ex)
{
throw ex;
}
}
}