1. 程式人生 > >C#Winform實現程式關閉隱藏窗體,二次程式啟動時顯示

C#Winform實現程式關閉隱藏窗體,二次程式啟動時顯示

思路:本程式啟動時候,儲存當前窗體控制代碼到檔案,

關閉時候隱藏窗體,不殺死程序,不退出.

下次啟動無需重新建立窗體,直接顯示原窗體,可以實現安卓程式的程序後臺隱藏效果.

點選桌面圖示,又同時可以防止多個程序多開的現象,避免多個程序衝突

好處:登入過的使用者,無需重新登入,系統後臺程序不關閉與伺服器的連線

廢話不多說,帖原始碼

(注:本文用到的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語言程式設計的思路,如果哪裡不對,請多指教大笑

哎,真是不太會弄這個佈局,改了好幾次,湊合看吧

相關推薦

C#Winform實現程式關閉隱藏窗體,程式啟動顯示

思路:本程式啟動時候,儲存當前窗體控制代碼到檔案, 關閉時候隱藏窗體,不殺死程序,不退出. 下次啟動無需重新建立窗體,直接顯示原窗體,可以實現安卓程式的程序後臺隱藏效果. 點選桌面圖示,又同時可以防止多個程序多開的現象,避免多個程序衝突 好處:登入過的使用者,無需重新登入,

C# Winform實現MDI程式子窗體與主窗體選單合併

這裡只講在MDI中,子選單與父選單合併的簡單方法。 首先在MDI的主窗體中: 1.在主窗體建構函式中,新增如下程式碼,注意要在InitializeComponent呼叫之後,如: //Add File Menu MenuItem miFile = mnuMain.Men

C# Winform實現捕獲窗體最小化、最大化、關閉按鈕事件的方法

comm c# 基於 prot void 地址 tp服務器 plugin ant 本文實例講述了C# Winform實現捕獲窗體最小化、最大化、關閉按鈕事件的方法,主要是通過重寫WndProc來實現的。分享給大家供大家參考。具體方法如下: 主要功能代碼如下:const i

C# Winform實現捕獲窗體最小化、最大化、關閉按鈕事件的方法,可通過重寫WndProc來實現

主要功能程式碼如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 const int WM_SYSCOMMAND = 0x112; const int SC_CLOSE = 0xF060; const i

C#Winform實現無邊框窗體滑鼠拖動

在有時候我們為了實現軟體的美觀,我們需要把窗體的邊框隱藏,但是問題也會隨之而來,在屬性中設定了FormBorderStyle應該為None,邊框便可以隱藏,但是我們在使用軟體時卻無法拖動窗體,

C#中WinForm實現控制元件隨窗體大小自適應改變

.NET框架允許你對子控制元件設定屬性,命令在調整父窗體大小時,它們應該如何運作。用來命令控制元件在調整大小時動作的兩個屬性就是“Dock”和“Anchor”。 Dock和Anchor通過將控制元件連線到它們父窗體的某個位置,而免除了使應用程式具有不可預知介面的麻煩。最好的一點就是設立這些屬性不需要任何

c#自己實現線程池功能()

mod 線程池 sharp ise except mar 函數 rac 試圖 介紹 在上一篇c#自己實現線程池功能(一)中,我們基本實現了一個能夠執行的程序。而不能真正的稱作線程池。因為是上篇中的代碼有個致命的bug那就是沒有任務是並非等待,而是瘋狂的進行while循環

C# winform實現記住用戶登錄的登錄狀態

end lose 用戶名 clas for 用戶 final con ring namespace DMS { public class LoginInfo { public string AccountID {

C# WinForm實現Windows 7 Aero磨砂玻璃效果

代碼 ear bool 效果 lac err mis 桌面 onload 代碼 using System; using System.Collections.Generic; using System.ComponentModel; using System

c# winform 實現打印功能(未完)

ble preview raw using ntp review winform setup print 1.打印控件介紹(Document屬性設置為PrintDocument1;ShowDialog()方法顯示對話窗) PrintDialog控件(打印會話):用於選擇打印

c語言實現用指標遍歷維陣列

1 #include <stdio.h> 2 void bian(int row,int col,int *a) 3 { 4 int i,j; 5 for(i=0;i<row;i++) 6 for(j=0;j<col;j++) 7

C#Winform 實現資料的匯出為txt或者CSV或者excel

//filePath 為儲存到本地磁碟的位置 private void Export(string filePath) { using (FileStream fs=new FileStream(filePath,FileMode.Create,

C#winform實現滑鼠響應左鍵按下,並記下其座標

private void Form1_MouseClick(object sender, MouseEventArgs e) { this.label1.Text = "相對座標:" +this.PointToClient(Mous

c語言實現24位彩色影象值化

// huiduhua.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include<stdio.h> #include<windows.h> int _tmain(int argc, _TCHAR*

c語言實現通用資料結構():通用佇列

     注意佇列中只儲存了指標,沒有儲存實際的資料。      標頭檔案 myQueue.h #ifndef MYQUEUE_H_INCLUDED #define MYQUEUE_H_INCLUDED #include "myList.h" typedef My

C# Winform 實現自定義半透明loading載入遮罩層

在網頁中通過div+css實現半透明效果不難,今天我們看看一種在winfrom中實現的方法: 效果圖如下,正常時: 顯示遮罩層時: 自定義遮罩層控制元件的原始碼如下: 1 using System; 2 using System.Drawing

C#winform實現跑馬燈

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text

C# Winform 控制元件大小隨窗體大小等比例縮放

當你的程式設計能力有了一定提升之後,那你在敲程式碼的時候就得開始想想怎麼將自己的寫的程式碼元件化了。所謂元件化,就是將程式碼中公共模組的程式碼提取出來作為一個方法或函式,使其能夠被其他程式或者他人直接使用。 public Form1() {

c# winform 實現多執行緒

UI介面就一個label一個button, 點選button讓label的值改變 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;

C#Winform去掉邊框後,窗體最大化,工作列被遮擋問題!

   問題描述:                         為了自定義設定介面的標題,邊框樣式,我們通常會把winform窗體的邊               框屬性設定為None,但去掉邊框的窗體在最大化時會擋住電腦桌面的工作列,               但任務