2012-10-15 42 views
5

我用互斥的解決方案,同時在多個Windows用戶有一個實例應用佔

但是,當我使用的窗口切換用戶,並打開另一個用戶更不允許開口比我的應用程序的一個實例,以及嘗試打開應用程序,它通常打開,無法檢測到它在其他帳戶下運行

我怎麼能解決這樣的事情,並禁止打開Windows中的用戶登錄間的應用程序帳戶

我使用的代碼像這樣

Dim onlyInstance As Boolean = False 
_mutex = New Mutex(True, "Application Name", onlyInstance) 
If Not onlyInstance Then 
    MessageBox.Show("Application is already running.", "Error.") 
    System.Diagnostics.Process.GetCurrentProcess.Kill() 
    System.Diagnostics.Process.GetCurrentProcess.WaitForExit() 
End If 

回答

4

如果你讓你的互斥全球性的,那麼這將是對所有用戶可見:

mutexName = String.Format("Global\\{{{0}}}", "Application Name"); 

documentation

命名系統互斥可以有知名度的兩個層次。如果其名稱 以前綴「全局」開頭,則該互斥鎖在所有終端 服務器會話中都可見。如果其名稱以前綴「Local \」開頭,則 互斥量僅在創建了 的終端服務器會話中可見。在這種情況下,服務器上每個其他終端服務器會話中可能存在一個具有相同名稱的單獨互斥體 。如果您在創建已命名互斥體時未指定前綴 ,則它會以 前綴「Local \」作爲前綴。在一個終端服務器會話中,兩個互斥體的名稱只有它們的前綴不同,這兩個互斥體是單獨的互斥體,並且這兩個互斥體對於終端服務器會話中的所有進程都可見,其中 。也就是說, 前綴名稱「Global \」和「Local \」描述了與終端服務器會話相關的名稱相對於進程而言的範圍。

+0

這實際上是海報所要求的相反 – Justin

+0

@Justin我扭轉了答案。謝謝.. – stuartd

+0

@Stuart,謝謝,這個前綴工作,做我想做的事情 – user1747513

0

我不認爲其他非管理員用戶可以看到其他用戶的進程。

我建議寫一個在系統空間中運行的windows服務。您的程序可以連接到它並確定是否啓動。

1

我已經使用了30年的技術是讓應用程序在啓動時嘗試打開(並保持打開)獨佔訪問的已知文件,然後在無法打開該文件時退出。

我知道這是嚴重的低科技和復古,但它很簡單,總是支持和作品字面上無處不在。我已經成功地將它用於超過六十種操作系統的生產代碼以及十幾種不同的編程語言。

相關問題