使用的WinAPI函数如下——
2.1
///<summary>
///该函数设置由不同线程产生的窗口的显示状态
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分</param>
/// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零</returns>
bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
/**************************************************************************/
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;//最小化指定的窗口并且激活在Z序中的下一个顶层窗口。
//窗口最小化,激活窗口仍然维持激活状态。
public const int SW_SHOWMINNOACTIVE = 7;
//以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。
public const int SW_SHOWNA = 8;
//激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。
public const int SW_RESTORE = 9;
//依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO结构是由启动应用程序的程序传递给CreateProcess函数的。
public const int SW_SHOWDEFAULT = 10;
//在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。
public const int SW_FORCEMINIMIZE = 11;
public const int SW_MAX = 11;
/****************************************************************************/
2.2
/// <summary>
/// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。
/// 系统给创建前台窗口的线程分配的权限稍高于其他线程。
/// </summary>
/// <param name="hWnd">将被激活并被调入前台的窗口句柄</param>
/// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零</returns>
bool SetForegroundWindow(IntPtr hWnd);
2.3
/// <summary>
///该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写
/// </summary>
/// <param name="IpClassName">指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。</param>
/// <param name="IpWindowName">指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配</param>
/// <returns>如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL</returns>
IntPtr FindWindow(string IpClassName, string IpWindowName);
示例程序如下——
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Diagnostics;
namespace WindowsApplication1
{
static class Program
{
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[System.Runtime.InteropServices.DllImport("User32.dll")]
public static extern IntPtr FindWindow(string IpClassName, string IpWindowName);
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;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//方法一
//调用 FindWindow 方法,若窗口存在则取得窗口句柄,否则返回NULL
IntPtr ihand = Program.FindWindow(null, "Form1");
if (ihand != IntPtr.Zero)
{
//测试 不同方法 返回的窗口的 句柄 是否一致
MessageBox.Show("WinAPI FindWindow 方法 : " + ihand.ToString());
MessageBox.Show("Process遍历的方法 : " + RuningInstance().MainWindowHandle.ToString());
ShowWindowAsync(ihand, SW_SHOWNOACTIVATE);//显示
}
else
{
//第一次创建的时候提示
MessageBox.Show("NO!!!!!!!");
Application.Run(new Form1());
}
//方法二
//Process process = RuningInstance();
//if (process == null)
//{
// Application.Run(new Form1());
//}
//else
//{
// HandleRunningInstance(process);
//}
}
//显示已经取得的实例
private static void HandleRunningInstance(Process instance)
{
ShowWindowAsync(instance.MainWindowHandle, SW_SHOWNOACTIVATE);//显示
//SetForegroundWindow(instance.MainWindowHandle);//当到最前端
}
//取得已经运行的窗口的 进程实例
private static Process RuningInstance()
{
Process currentProcess = Process.GetCurrentProcess();
Process[] Processes = Process.GetProcessesByName(currentProcess.ProcessName);
foreach (Process process in Processes)
{
if (process.Id != currentProcess.Id)
{
if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "//") == currentProcess.MainModule.FileName)
{
return process;
}
}
}
return null;
}
}
}