建立單例項應用程式的三種方法

2021-08-27 07:23:52 字數 1966 閱讀 9212

在編寫windows桌面應用程式時,如果我們沒有特別處理,我們是可以開啟多個應用程式例項的。例如,我們在同一臺機器上掛開啟多個qq程式,也可以開啟多個瀏覽器視窗。但有些應用程式,卻只執行單個例項執行,如outlook,msn等。那麼如何實現單例項應用程式呢?下面介紹三種方法。

這是最容易想到的方法,實現起來也比較簡單。掃瞄程序的**如下,假設應用程式名稱為mysingleinstance.exe。

process processes = process.getprocessesbyname("mysingleinstance"); // no ".exe"

if (processes.length > 1)

簡單幾行**就可以實現單例應用程式了,只是稍微有些不夠友好,因為當試圖開啟第二個例項時會彈出乙個不夠友好的對話方塊「another instance is running.」,但如果我們把這行**去掉後,又缺少了使用者的互動。因此我們可以安裝msn或outlook的方式--啟用正在執行的例項。

這需要呼叫windows api,如下**:

process processes = process.getprocessesbyname("mysingleinstance");

if (processes.length > 1)

long style = getwindowlong(hwnd, gwl_style);

if ((style & ws_minimize) == ws_minimize)

setforegroundwindow(hwnd);

return;

}

使用的windows api的宣告,如下:

[dllimport("user32.dll")]

private static extern bool showwindow(intptr hwnd, uint ncmdshow);

[dllimport("user32.dll")]

private static extern bool setforegroundwindow(intptr hwnd);

[dllimport("user32.dll")]

private static extern long getwindowlong(intptr hwnd, int nindex);

private const int sw_shownoactivate = 4;

const int gwl_style = -16;

const long ws_minimize = 0x20000000l;

完整的**鍵附近中program1.cs

如果你覺得掃瞄程序比較「笨拙」的話,那麼有乙個稍微專業一點的做法,使用互斥量mutex。如果有多執行緒開發經驗的,都應該使用過mutex,該模擬較可以實現執行緒的同步,而且是可以對其命名,並且是跨程序的。mutex的建構函式簽名:mutex(bool initiallyowned, string name, out bool creatednew),其中creatednew表示十分已經存在相同名稱的mutex,如果存在creatednew為false,沒有則為true。利用該值可以判斷應用程式的例項是否已經被建立。但在creatednew為false的情況時,還是需要方法一,來啟用已建立的例項視窗。其實是有mutex沒有減少建立單例項的複雜度,反而更複雜了,而且建立的mutex物件也不再使用,建立該物件也比較耗資源,該方法一般不會採用。

base.issingleinstance = true;

base.enablevisualstyles = true;

}protected override void oncreatemainform() }

[stathread]

static void main(string args)

執行效果同方法一,二相同,關鍵是**更簡潔,物件導向。完整**見program3.cs

Qt下儲存讀寫應用程式設定的三種方法

使用者對應用程式經常有這樣的要求 要求它能記住它的settings,比如視窗大小 位置和密碼等等。有三種方法可以實現 登錄檔 registry 是windows中的乙個重要的資料庫,用於儲存系統和應用程式的設定資訊。qt提供了乙個qsettings類,在windows平台,它提供了ini檔案讀寫,登...

WPF兩種方法實現單例項應用程式

所謂單例項應用程式就是只能開啟乙個程序的應用程式,通常未做處理的wpf程式可以多次點選exe程式,每次點選,系統都會分配乙個程序。這樣不僅造成了資源的浪費還會導致其他各種問題,例如,我們的程式裡面寄宿了乙個wcf介面,那多次啟動會導致埠繫結錯誤。為了讓大家對此有個更加深刻的印象,下面做個簡單的演示。...

建立物件的三種方法

三種方式 利用字面量建立物件 物件字面量 就是花括號 裡面包含了表達這個具體事物 物件 的屬性和方法。var a 1.裡面的屬性或者方法我們採取鍵值對的形式鍵屬性名 值屬性值 2.多個屬性或者方法中間用逗號隔開的 3.方法冒號後面跟的是乙個匿名函式 使用物件 1.呼叫物件的屬性我們採取物件名.屬性名...