應用程式每次只能執行一個例項(C#)
class InstanceManager {
[DllImport("user32.dll")] //使用user32.dll中提供的兩個函式實現顯示和啟用
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
private const int WS_SHOWNORMAL = 1;
public static Process RunningInstance() { //查詢是否有同名的程式並比對資訊
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach(Process process in processes){
if (current.Id != process.Id &&
current.MainModule.FileName == process.MainModule.FileName) {
return process;
}
}
return null;
}
public static void HandleRunningProcess(Process instance) {
//確保視窗沒有被最小化和最大化
ShowWindowAsync(instance.MainWindowHandle,WS_SHOWNORMAL);
//將窗體顯示在前面
SetForegroundWindow(instance.MainWindowHandle);
}
}
現在很多應用程式啟動後都有多個程式在執行,所以在方法RunningInstance中我們透過MainModule來獲得應用程式啟動程式的可執行檔案資訊,而不是直接比較程式名。這樣也避免了當前程式的程式名只是與其他應用程式包含的某個程式名相同而被阻止執行的情況,當然啟動程式的程式名也有可能相同,這也是我覺得這種方法不足的地方之一,希望能夠有所改進,或許可以比對更多的資訊,或許還有其他的什麼方法。
在方法HandleRunningProcess中是透過user32.dll中提供的兩個函式實現顯示和啟用的,我搜了很多地方並沒有發現C#中有支援顯示和啟用窗體的類或方法,不知道是不是還沒找到,如果有人知道希望能告訴我一下。
在實現了上面的類後,就可以在Main函式中的顯示和例項化窗體之前加入相應的判斷,程式碼如下:
static void Main()
{
Process instance = InstanceManager.RunningInstance();
if (instance == null)
{ //下面的三行程式碼是之前Main函式中的
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else {
InstanceManager.HandleRunningProcess(instance);
}
}
========================================================================
/*
//防止客戶端大廳啟動多個程式
//大廳啟動的程式數
//宣告互斥體
mutex = new Mutex(false, "ThisShouldOnlyRunOnce_ICST_CLientHome ");
//判斷互斥體是否使用中。
bool Running = !mutex.WaitOne(0, false);
if (!Running)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//frmMainHome frm= new frmMainHome();
FrmLogin frm = new FrmLogin();
Application.Run(frm);
}
else
{
//Common.Common.MessageBoxShow("應用程式已經啟動!","提示資訊",MessageBoxButtons.OK,MessageBoxIcon.Information);
}*/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20200170/viewspace-749098/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#控制只能程式執行一個C#
- c#如何只能建立類的一個例項(一)C#
- js規定函式只能執行一次程式碼例項JS函式
- js呼叫執行exe應用程式程式碼例項JS
- winform程式打包後 只能執行一個ORM
- C#多執行緒程式設計例項C#執行緒程式設計
- Win10 Redstone 4允許執行多個UWP應用程式例項Win10
- NCF的Dapr應用例項的執行
- dddsample一個可執行的例項
- 僅允許程式一個例項執行VC6
- C#實現單例項執行C#單例
- winform只允許一個應用程式執行ORM
- selenium-grid 有多個節點,但 pytest.main 批次執行用例,每次只有一個節點執行用例,不能同時多個節點執行,要怎樣才能多個節點同時執行AI
- localStorage應用程式碼例項
- 題目:設計一個類,我們只能生成該類的一個例項。 程式碼如下
- python幾個應用例項Python
- 在 Mac 上執行 Windows 應用程式,只需一個CrossOver!MacWindowsROS
- 限制程式執行例項數 (轉)
- WEB例項:開發一個聊天室應用Web
- opacity應用程式碼例項
- Linux中執行多個MySQL例項LinuxMySql
- 在Windows中執行多個MySQL例項WindowsMySql
- findmnt 命令的八個應用例項
- 一個Flask應用執行過程剖析Flask
- onfocus和onblur應用程式碼例項
- Object.defineProperty()應用程式碼例項Object
- Java多執行緒/併發05、synchronized應用例項:執行緒間操作共享資料Java執行緒synchronized
- C#並行,多執行緒程式設計並行集合和PLINQ的例項講解並行執行緒程式設計
- 唯一標識 Java 執行的例項Java
- 如何使用低程式碼開發平臺快速建立一個應用 | 例項演示
- JVM程式用一個主執行緒來執行main()方法JVM執行緒AI
- C# socket 阻止模式與非阻止模式應用例項C#模式
- dd應用例項
- C#開發單例項應用程式並響應後續程序啟動引數C#單例
- face_recognition的5個應用例項
- 限定文字框只能輸入數字例項程式碼
- Python程式和執行緒例項詳解Python執行緒
- pytest(13)-多執行緒、多程式執行用例執行緒