网上搜了一堆代码拿过来结果只能监测程序是否运行,而不能让程序显示,因为我已经把程序隐藏到托盘
改变一下思路:利用序列化和反序列化技术来实现这个功能,首先在主窗体程序运行的时候,将当前窗体的句柄序列化到指定文件:
#region 将当前主窗体序列化到文件
/// <summary>
/// 将当前主窗体序列化到文件
/// </summary>
/// <param name="hWnd"></param>
public static void SetMainFormSerialize(IntPtr hWnd)
{
//序列化
FileStream fs = new FileStream("MainFormSerialize", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, hWnd);
fs.Close();
}
#endregion
然后在窗体的Load事件中调用这个方法:
SetMainFormSerialize(this.Handle);
这样就把当前句柄序列化到文件
然后修改Program文件代码:
static class Program
{
/// <summary>
/// 设置窗体显示
/// </summary>
/// <param name="hWnd">窗体句柄</param>
/// <param name="fAltTab">是否显示</param>
/// <returns></returns>
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
bool isCanStart;
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "aaaa", out isCanStart);
if (isCanStart)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Main());
}
else
{
try
{
SwitchToThisWindow(GetMainFormSerialize(), true);
}
catch (Exception ex){}
}
}
#region 获取前主窗体序列化文件对象
/// <summary>
/// 获取前主窗体序列化文件对象
/// </summary>
/// <returns></returns>
public static IntPtr GetMainFormSerialize()
{
try
{
//文件路径
string filePath = "MainFormSerialize";
//判断文件是否存在
if (File.Exists(filePath))
{
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
IntPtr hWnd = (IntPtr)bf.Deserialize(fs);
return hWnd;
}
}
}
catch (Exception ex){ }
return new IntPtr();
}
#endregion