思路:本程序启动时候,保存当前窗体句柄到文件,
关闭时候隐藏窗体,不杀死进程,不退出.
下次启动无需重新创建窗体,直接显示原窗体,可以实现安卓程序的进程后台隐藏效果.
点击桌面图标,又同时可以防止多个进程多开的现象,避免多个进程冲突
好处:登录过的用户,无需重新登录,系统后台进程不关闭与服务器的连接
废话不多说,帖源码
(注:本文用到的RsConfig类为自定义文件类,主要以Key,Value形式存储句柄,暂不提供源码,如需修改,请自行定义)
新建WINFORM程序,找到Program.cs文件,进行修改
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包
using System.Diagnostics;
namespace WindowsFormsTest
{
static class Program
{
[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
private const int SW_HIDE = 0; //常量,隐藏
private const int SW_SHOWNORMAL = 1; //常量,显示,标准状态
private const int SW_SHOWMINIMIZED = 2; //常量,显示,最小化
private const int SW_SHOWMAXIMIZED = 3; //常量,显示,最大化
private const int SW_SHOWNOACTIVATE = 4; //常量,显示,不激活
private const int SW_RESTORE = 9; //常量,显示,回复原状
private const int SW_SHOWDEFAULT = 10; //常量,显示,默认
public static RsConfig rsConf = null;// 定义全局文件
public static string strPathFile = System.AppDomain.CurrentDomain.BaseDirectory + "config.rs";// 文件全局路径
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
rsConf = new RsConfig(strPathFile);// 文件类声明
int nHand = Int32.Parse(rsConf.get("handle"));// 获得文件中的句柄(字符串类型)// 转整型
IntPtr intPtr = (IntPtr)nHand;// 转句柄
// 显示该句柄的窗口,如果没有显示则返回false
bool b = ShowWindowAsync(intPtr, SW_SHOWNORMAL);
// 如果没有返回true说明没有窗口,正常创建进程
if (!b)
{
//没有运行的进程
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
}
主程序写完了,下面就要对窗体做出具体的控制,在load事件中获得当前窗体的句柄,并且保存到文件中
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包
using System.Diagnostics;
namespace WindowsFormsTest
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
Private void Form1_Load(object sender, EventArgs e)
{
Program.rsConf.set("handle", this.Handle.ToString());
Program.rsConf.save();
}
}
}
Process current = Process.GetCurrentProcess();// 获取当前进程
ShowWindowAsync(current.MainWindowHandle, 0);// 隐藏窗体
这样可就可以实现程序唯一运行,并且类似于安卓或苹果的后台进程效果了!
C#初学,还不是特别熟,有些想法还是类似于MFC下的C语言编程的思路,如果哪里不对,请多指教
哎,真是不太会弄这个布局,改了好几次,凑合看吧