2012-10-16 27 views
1

我認爲會很容易的就是快速擊敗我。我不是本機C#程序員,但被要求創建一個具有單個實例的WinForm應用程序。我已經在StackOverflow上看到了Mutex的例子,但是有一點我沒有意識到能夠在命令行上將參數傳遞給窗口,解析這些值並用新值重新繪製窗體。重繪的單實例C#窗口

任何人都有這樣的例子嗎?似乎讓我失望的主要是線程。我想運行my.exe並顯示窗口。每次表單運行時,我都不需要一個新表單 - 只需要獲取新參數並將其顯示在表單中即可。

全部/謝謝!

+0

請把一些更多的細節。例如關於你怎麼稱呼你窗戶等 –

+2

http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx –

+0

@ HansPassant的建議+1恕我直言,這應該已被張貼爲答案,並被投票的一個=) – 2012-10-16 22:59:44

回答

1

當您啓動應用程序的另一個實例時,您運行的代碼相同,但程序不同。所以,你需要看看passing data between processes。類似命名管道或遠程處理。

+0

我的第一反應是使用像RabbitMQ這樣的經紀商,但該項目的出價非常低,這是我第一次進入C#編程領域。 Hans Passant留下的評論是我最終做的。謝謝回覆! – Griff

+0

不知道VB中的'WindowsFormsApplicationBase' - 非常簡單的解決方案。但仍然相同 - 它使用Remoting,正如我建議的那樣, –

0

@lazyberezovsky是對的。再次從命令行調用應用程序會產生一個不相關的,不相關的進程,並且在退出正在調用的新進程之前,您需要進程間通信將新參數轉發到之前運行的應用程序實例。

恕我直言,在這兩個進程之間進行通信的最簡單方法(並非最好)將使用Windows註冊表,因爲這已經是線程安全的且API非常簡單。

首先,當應用程序運行時,在顯示主窗體之前,我會perform a check to see if another instance of the app is running

如果爲false,這是應用程序第一次運行,我將處理命令行並將窗體顯示爲常規。我還會清除用於進程間通信的註冊表項(見下文)。

如果爲true,那麼我會將命令行存儲在registry中的特定鍵上,該鍵用於進程間通信,然後我將終止應用程序,甚至不顯示主窗體。

您正在運行的應用程序(第一個實例)需要啓動一個輪詢機制(可能是Windows計時器每秒觸發一次),該機制會定期檢查預期有新命令行的註冊表項。它通常會查找並清空字符串,並且什麼也不做,但是如果檢索到的值不是空的,那麼這將意味着用戶再次使用不同的參數生成應用程序,然後您可以繼續解碼命令行並重新繪製窗口有必要的。在此之後,請確保您再次清除註冊表項,以便輪詢機制恢復並在下次用戶調用應用程序時檢測到。

命名管道,WCF,.remoting或TCP套接字是可以使用的IPC機制,不需要輪詢機制,這可能會被某些人所詬病。 ;)

希望這有助於!

+1

@HansPassant提交的鏈接指的是比我的替代方案更好(更清潔)的解決方案。請看看它。 =) – 2012-10-16 22:53:49

+0

感謝您花時間閱讀我的問題並回復! – Griff