思路:本程序启动时候,保存当前窗体句柄到文件,

关闭时候隐藏窗体,不杀死进程,不退出.

下次启动无需重新创建窗体,直接显示原窗体,可以实现安卓程序的进程后台隐藏效果.

点击桌面图标,又同时可以防止多个进程多开的现象,避免多个进程冲突

好处:登录过的用户,无需重新登录,系统后台进程不关闭与服务器的连接

废话不多说,帖源码


(注:本文用到的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();
        }
    }
}


后面的事情就是将关闭按钮,ALT+F4响应事件,以及某些自定义关闭按钮进行修改,去掉关闭的代码改成下面两行

Process current = Process.GetCurrentProcess();// 获取当前进程
ShowWindowAsync(current.MainWindowHandle, 0);// 隐藏窗体


这样可就可以实现程序唯一运行,并且类似于安卓或苹果的后台进程效果了!


C#初学,还不是特别熟,有些想法还是类似于MFC下的C语言编程的思路,如果哪里不对,请多指教大笑

哎,真是不太会弄这个布局,改了好几次,凑合看吧




本文转载:CSDN博客