[C#] Winform 中的「自動關閉」及「單一檔執行」技巧

好久沒有來發發相關 C# 的教學技術文件了.....因為最近忙自己的國外投稿 ( BAI2009 ) 的相關文章及演算法程式,搞的我都太筋疲力盡了說.....不過,想想為了自己的最愛,多花點力氣也是值得的
嗯.....前幾天在 F6 Team ( Puma 大大) 那看到兩篇文章, 覺得實用性也應該算是頗高,也很具意義,所以我自己也親自地實作了一遍,


1. 自動關閉 MessageBox 視窗小技巧
2. Exe執行檔單獨運行小技巧
 

就這樣地,我把兩個主題融合成一個範例程式,親自實作了一次,並加些參考內容.....此外,也可以單獨自訂 MessageBox 顯示幾秒後要關閉的時間。
 

<本範例需 coding 時需注意提示 >
1. 需運用到兩個檔案,「FrmHybridFunction.cs 」跟「Program.cs
 

< 本範例下載位置 >
http://www.blueshop.com.tw/download/show.asp?pgmcde=PGM200903110001338SN
 

< 本範例 GUI 參考圖 >

 

image

 

< 範例程式碼 >
 

檔案一:  FrmHybridFunction.cs 檔

 

//////////////////////////////////////////////////////////////////////////
//
// <Author> Nobel12 (軋延油) </Author>
// <Blog> http://www.wretch.cc/blog/nobel12 </Blog>
// <Reference>
// 1. http://www.dotblogs.com.tw/puma/archive/2009/02/06/7060.aspx
// 2. http://www.dotblogs.com.tw/puma/archive/2009/02/15/7179.aspx
// 3. http://blog.yam.com/swwuyam/article/12306741
//
// <Remark> 本程式範例涵蓋兩大方向:
//           1. 定時自動關閉 MessageBox 視窗小技巧
//           2. EXE執行檔,單獨(檔)執行小技巧 (此部份請同時參考 Program.cs 檔 )
//////////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

// 下方為使用到 DllImport 時必要加入的參考項目
using System.Runtime.InteropServices;
// 下方為使用 Process 時需加入的參考
using System.Diagnostics;

namespace FrmhybridFunction
{
    public partial class FrmHybridFunction : Form
    {

#region 定時自動關閉MessageBox視窗小技巧

        /// <summary>
        /// FindWindow 功能為「找尋視窗」之用
        /// </summary>
        /// <param name="lpClassName">該視窗屬於哪種類型</param>
        /// <param name="lpWindowName">該視窗的標題名稱</param>
        /// 兩參數僅知道一個即可執行尋找
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)] 
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName); 
       
        /// <summary>
        /// 對於 PostMessage 的參數用法....
        /// 在  http://blog.yam.com/swwuyam/article/12306741 有針對 PostMessage 與 SendMessage 的詳盡說明
        /// </summary>
        /// <param name="hWnd">handle of the destination window </param>
        /// <param name="msg">message to post</param>
        /// <param name="wParam">first message parameter </param>
        /// <param name="lParam">second message parameter </param>
        /// <returns></returns>
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)] 
        public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 
       
        public const int WM_CLOSE = 0x10;
       

        public FrmHybridFunction()
        {
            InitializeComponent();
        }


        private void btnExcuteS1_Click(object sender, EventArgs e)
        {

            int getSec;
            bool GMError = int.TryParse(txtSec.Text, out getSec);
            if (GMError == false)
            {
                getSec = 1;
                txtSec.Text = "1";
            }

            StartKiller(getSec); 
            MessageBox.Show(getSec.ToString() + " 秒後自動關閉MessageBox視窗", "I'm MessageBox Title!!! Here!");
           
        }

        private void StartKiller(int getTime)
        {
             Timer SetTimer = new Timer();          // 宣告一個Timer物件,名稱為 SetTimer
             SetTimer.Interval = (getTime*1000);           // X 秒後啟動
             SetTimer.Tick += new EventHandler(SetTimer_Tick);   // 建立一個觸發 Tick 事件
             SetTimer.Start();                      // 啟動 Timer (即 SetTimer 開始啟動 )
        }

        void SetTimer_Tick(object sender, EventArgs e)
        {
             KillMessageBox();          // 執行把 MessageBox 刪除 (即讓MessageBox消失)
           
             ((Timer)sender).Stop();    // 停止時間。記得要轉型為 Timer 型別
        }

        private void KillMessageBox()
        { 
             // 依 MessageBox 的「標題」,找出MessageBox的視窗 
             IntPtr ptr = FindWindow(null, "I'm MessageBox Title!!! Here!"); 
             if (ptr != IntPtr.Zero)     // 此表示只要 ptr 不為空值的內容時
             { 
                 //找到則關閉 MessageBox 視窗 
                 PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
             }

         }

#endregion


#region EXE執行檔,單獨(檔)執行小技巧

         private void btnExcuteS2_Click(object sender, EventArgs e)
        {
            string Ap_Path = Application.ExecutablePath;
            Process.Start(Ap_Path);
        }

#endregion
    }

}

 

檔案二:  Program.cs 檔

 

//////////////////////////////////////////////////////////////////////////
//
// <Author> Nobel12 (軋延油) </Author>
// <Blog> http://www.wretch.cc/blog/nobel12 </Blog>
// <Reference>
// 1. http://www.dotblogs.com.tw/puma/archive/2009/02/06/7060.aspx
// 2. http://www.dotblogs.com.tw/puma/archive/2009/02/15/7179.aspx
// 3. http://blog.yam.com/swwuyam/article/12306741
// 4. http://www.blueshop.com.tw/board/show.asp?subcde=BRD20090213164530GII&fumcde=FUM20050124192253INM#BRD20090215180413HRO
// 5. http://www.cnblogs.com/ghostljj/archive/2007/10/02/912979.html
// <Remark> 本程式範例涵蓋兩大方向:
//           1. 定時自動關閉 MessageBox 視窗小技巧 ( 此部份請參考 FrmHybridFunction.cs 檔 )
//           2. EXE執行檔,單獨(檔)執行小技巧
//////////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Windows.Forms;

// 下方為使用到 DllImport 時必要加入的參考項目
using System.Runtime.InteropServices;
// 下方為使用 Process 時需加入的參考
using System.Diagnostics;
// 下方為使用Assembly 時需加入的參考
using System.Reflection;

namespace FrmhybridFunction
{
    static class Program
    {
        /// <summary>
        /// 應用程式的主要進入點。
        /// </summary>
        [STAThread]
        static void Main()
        {
             //Get   the   running   instance.    
             Process instance = RunningInstance(); 
             if (instance == null) 
             { 
                 System.Windows.Forms.Application.EnableVisualStyles(); 
                 System.Windows.Forms.Application.DoEvents(); 
  
                 //There  isn't another instance, show our form.    
                 Application.Run(new FrmHybridFunction()); 
             } 
             else 
             { 
                 //There is another instance of this process.   
                 HandleRunningInstance(instance); 
             } 


            // 以下為原始專案之內容
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new FrmHybridFunction());
        }

         public static Process RunningInstance() 
         { 
             Process current = Process.GetCurrentProcess(); 
             Process[] processes = Process.GetProcessesByName(current.ProcessName); 
  
             //Loop through  the running processes in with the same name    
             foreach (Process process in processes) 
             { 
                 //Ignore   the   current   process   
                 if (process.Id != current.Id) 
                 { 
                     //Make sure that the process is running from the exe file.    
                     if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) 
                     { 
                         //Return   the   other   process   instance.   
                         return process; 
                     } 
                 } 
             } 
             //No other instance was found, return null.  
             return null; 
         } 
  
         public static void HandleRunningInstance(Process instance) 
         { 
             //Make sure the window is not minimized or maximized  
             ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); 

             //Set the real intance to foreground window 
             SetForegroundWindow(instance.MainWindowHandle); 
         } 
  
         [DllImport("User32.dll")] 
         private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); 
         [DllImport("User32.dll")] 
         private static extern bool SetForegroundWindow(IntPtr hWnd); 
        
         // 控制視窗大小
         // 1:normal 
         // 2:minimized 
         // 3:maximized 
         private const int WS_SHOWNORMAL = 1;
    }
}

 

< 相關參考網址 >
1. http://www.dotblogs.com.tw/puma/archive/2009/02/06/7060.aspx
2. http://www.dotblogs.com.tw/puma/archive/2009/02/15/7179.aspx
3. http://blog.yam.com/swwuyam/article/12306741
4. http://www.blueshop.com.tw/board/show.asp?subcde=BRD20090213164530GII&fumcde=FUM20050124192253INM#BRD20090215180413HRO
5. http://www.cnblogs.com/ghostljj/archive/2007/10/02/912979.html


回應

目前沒有回應.

標題:
姓名:
電子郵件: (將不會被顯示)
個人網頁:
內容: 

登入後使用進階評論
Please add 1 and 3 and type the answer here: