無住心&快樂碼

--- Write less code, get more fun! BETWEEN "Code-Fun" ---

文章標籤


more tags...
  • 文章數(238)
  • 回應數(317)
  • 引用數(0)

※ Translate / 翻訳 ※

 


如果你覺得本站內容不錯,
請你給個 Like!
鼓勵我一下吧!謝謝!
Start:2010.10.13


MVP(微軟最有價值專家獎)



 

My MVP Profile

Domain:Visual C#
Since 2010~2011 (Q4)

Domain:Office 365
Since 2012, Q4






★ 強力推廣 ★

中道會 ─ 李瑞烈 老師


★ 老師一生宗旨:
 談道不談錢,
   談錢非道也!



§ 請您在下方幫忙 按個讚
 一同支持我的粉絲頁吧~ §

 

★ 中道會 FB 粉絲專頁 ★

 



※ 論壇連結 ※






大會成績公告
本次比賽成果




MSN 即時通訊區



統計專區



人數:





 

最新回應

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

2009/10/5 12:58 | 閱讀數 : 7173 1 人收藏 我要推薦 | Add Comment | 文章分類 : Visual C# Win32 API 訂閱

好久沒有來發發相關 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

 

 

 

~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~

Facebook 分享  或 

 

~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~

★ 特別推廣區: ( Time:即日起 ~  )

 

 

 

~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~。~


DotBlogs Tags: C# Win32 API

關連文章

回應

目前沒有回應.
  • 標題 *
  • 名稱 *
  • 信箱(將不會被顯示)
  • 網址
  • 回應
  • 登入後使用進階評論
  • Please add 6 and 1 and type the answer here: