您的位置:首页 > 编程语言 > C#

c#单一程序运行续-最小化后显示

2011-07-20 15:06 232 查看
程序最小化后,再点击程序,程序最大化。

static class Program
{
[DllImport("user32.dll ", CharSet = CharSet.Unicode)]

public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

[DllImport("User32.dll ", EntryPoint = "FindWindow")]

private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);//关键方法

[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]

public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);//关键方法

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());

//判断之前是否已经打开了相同的进程
//new Bestzone.MIS.Report.F1BookContainer();
IntPtr handle;
IntPtr ishandle = new IntPtr(0);

handle = FindWindow(null, "集中控制系统");
if (handle == ishandle)
{
handle = FindWindow(null, "集中控制系统-车身控制");
}
if (handle == ishandle)
{
handle = FindWindow(null, "集中控制系统-配电监测");
}
if (handle == ishandle)
{
handle = FindWindow(null, "集中控制系统-环境监控");
}
if (handle == ishandle)
{
handle = FindWindow(null, "集中控制系统-视频监测");
}

bool alreadyExist = false;
try
{
System.Diagnostics.Process curP = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process p in ps)
{
if (p.ProcessName.Equals(curP.ProcessName) && p.Id != curP.Id)
{
alreadyExist = true;
}
}
}
catch (System.PlatformNotSupportedException ex) { ex.ToString(); }
catch (System.InvalidOperationException ex) { ex.ToString(); }

//如果已经存在,则放弃本进程
if (alreadyExist)
{
MessageBox.Show("该程序正在!");
ShowWindow(handle, 3);
return;
}

Application.Run(new Form1());
}

//===============================================================

FindWindow()函数的用法。要在C#里使用该API,写出FindWindow()函数的声明:
[DllImport("coredll.dll", EntryPoint = "FindWindow")]
private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如"计算器",所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如"记事本",如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的句柄,否则返回0。 看例子
IntPtr ParenthWnd = new IntPtr(0);
ParenthWnd = FindWindow(null,"Word Mobile");
//判断这个窗体是否有效
if (ParenthWnd != IntPtr.Zero)
{
MessageBox.Show("找到窗口");
}
else
MessageBox.Show("没有找到窗口");

注:不知道第一个参数应该怎么用,查了资料也试验过都不好用,谁知道“窗口的类”是什么可以告诉我。学习下。
//===============================================================
[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)] public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);函数功能:该函数设置指定窗口的显示状态。 参数: hWnd:窗口句柄。 nCmdShow:指定窗口如何显示。如果发送应用程序程序提供了STARTUPINFO结构,则应用程序第一次调用ShowWindow时该参数被忽略。否则,在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow参数。在随后的调用中,该参数可以为下列值之一: SW_FORCEMINIMIZE:在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。 SW_MIOE:隐藏窗口并激活其他窗口。 SW_MAXIMIZE:最大化指定的窗口。 SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。 SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。 SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。 SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序程序传递给CreateProcess函数的。 SW_SHOWMAXIMIZED:激活窗口并将其最大化。 SW_SHOWMINIMIZED:激活窗口并将其最小化。 SW_SHOWMINNOACTIVATE:窗口最小化,激活窗口仍然维持激活状态。 SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。 SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。 SW_SHOWNOMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。 返回值:如果窗口以前可见,则返回值为非零。如果窗口以前被隐藏,则返回值为零。 备注:应用程序第一次调用ShowWindow时,应该使用WinMain函数的nCmdshow参数作为它的nCmdShow参数。在随后调用ShowWindow函数时,必须使用列表中的一个给定值,而不是由WinMain函数的nCmdSHow参数指定的值。Public Const SW_HIDE = 0Public Const SW_SHOWNORMAL = 1Public Const SW_SHOWMINIMIZED = 2Public Const SW_SHOWMAXIMIZED = 3Public Const SW_MAXIMIZE = 3Public Const SW_SHOWNOACTIVATE = 4Public Const SW_SHOW = 5Public Const SW_MINIMIZE = 6Public Const SW_SHOWMINNOACTIVE = 7Public Const SW_SHOWNA = 8Public Const SW_RESTORE = 9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐