天天看點

實作單程序(Single Instance)的.NET WinForm應用程式

    最近發現我參與開發的基于.NET WinForm + WebService的呼叫中心應用程式如果用戶端打開一個以上視窗的時候會出現非預期的異常.這促使我将我們的應用程式改進成同一時間内隻允許有一個程序運作.

    基本的原理上Google一搜一大把,無非是利用System.Diagnostics.Process.GetProcess()方法擷取當先系統所有運作着的程序資訊來進行判斷.但是我們有一個特殊的要求,那就是如果發現已經有程序在運作着就把這個運作中程序的主窗體顯示出來.

    既然要擷取目前程序的主窗體,那麼就從Process類的屬性着手, Process類有一個名為MainWindowHandle的屬性,其類型為System.IntPtr, 表示一個指向該程序主窗體的指針, OK,知道這些就好辦了.既然是指針那麼肯定不能使用托管代碼的方法來操縱窗體了. 這也OK, 用API呗.

    MSDN了一下Windows API,發現了這麼幾個方法對我有用.

BOOL ShowWindowAsync(HWND hWnd,int nCmdShow);

The ShowWindowAsync function sets the show state of a window created by a different thread.

VOID SwitchToThisWindow(HWND hWnd, BOOL fAltTab);

The SwitchToThisWindow function is called to switch focus to a specified window and bring it to the foreground.

具體的代碼實作如下: