C# 只开启一个程序,如果第二次打开则自动将第一个程序显示到桌面
来源:互联网 发布:淘宝男装夏季 编辑:程序博客网 时间:2024/06/04 20:04
转载自http://www.cnblogs.com/Hdsome/archive/2012/08/13/2635797.html如有侵权,请联系删除
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Reflection;
namespace AppLed
{
static class Program
{
//防止程序运行多个实例的方法有多种,如:通过使用互斥量和进程名等.而我想要实现的是:在程序运行多个实例时激活的是第一个实例,使其获得焦点,并在前端显示.
//主要用到两个API 函数:
//ShowWindowAsync 该函数设置由不同线程产生的窗口的显示状态。
//SetForegroundWindow 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
/// <summary>
/// 该函数设置由不同线程产生的窗口的显示状态。
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分。</param>
/// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零。</returns>
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
/// <summary>
/// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
/// </summary>
/// <param name="hWnd">将被激活并被调入前台的窗口句柄。</param>
/// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。</returns>
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
private const int WS_SHOWNORMAL = 1;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Process instance = RunningInstance();
if (instance == null)
{
Application.Run(new FrmLed());
}
else
{
HandleRunningInstance(instance);
}
}
/// <summary>
/// 获取正在运行的实例,没有运行的实例返回null;
/// </summary>
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach (Process process in processes)
{
if (process.Id != current.Id)
{
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
return process;
}
}
}
return null;
}
/// <summary>
/// 显示已运行的程序。
/// </summary>
public static void HandleRunningInstance(Process instance)
{
//MessageBox.Show("ID:"+instance.Id .ToString()+"--句柄"+instance.MainWindowHandle.ToString() + "--正常窗口" + WS_SHOWNORMAL + "--" + ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL) + "--" + SetForegroundWindow(instance.MainWindowHandle));
ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); //显示,可以注释掉
SetForegroundWindow(instance.MainWindowHandle); //放到前端
}
}
}
- C# 只开启一个程序,如果第二次打开则自动将第一个程序显示到桌面
- C#只打开一个窗口(程序)
- 启动程序(第二次开启程序,显示第一次打开的程序)
- android - ScrollView嵌套ListView,ListView自动聚焦到第一个,和只显示一个
- 第一个C#程序
- 第一个C#程序
- 第一个C#程序
- 第一个c#程序
- 第一个C#程序
- 第一个MyBatis程序 将一个学生信息写入到DB
- 线程异常,而进程不死 | 每次只打开一个桌面程序
- 开启Lua编程,第一个Lua程序
- 第一个C# 程序:万年历
- C#的第一个程序
- c#第一个.NET程序
- C#的第一个程序
- 第一章 第一个c#程序
- C#程序在一个终端中只允许打开一次,防止多次打开
- JSON Schema详解
- tensorflow常用函数及概念
- 如何自己做lenet样本,使用LMDB格式
- CSS3的calc()做响应模式布局
- Maven标签解释
- C# 只开启一个程序,如果第二次打开则自动将第一个程序显示到桌面
- Wifi 控制
- Unity 5着色器系统代码介绍(上)
- 资讯精选 | 如何保证人工智能与HPC的成功融合?
- sql 20170906 left join
- C++回顾(三)智能指针
- NZT提示200;201;202处理方式
- 数据库设计
- Longest Palindromic Substring