答えて
私はすでにremotingを使用して実装していますが、空き時間が増えるとこれを行う他の方法も検討します。ここで私はそれをやった方法は次のとおりです。私たちが持っているフォームクラスで :
public Main()
{
InitializeComponent();
this.ShowFromFormShower = new FormShower.ShowFromFormShowerDelegate(this.ShowFromFormShower1);
FormShower.Register(this);
}
private void ShowFromFormShower1()
{
this.Show();
this.WindowState = FormWindowState.Normal;
this.BringToFront();
}
public PKW.FormShower.ShowFromFormShowerDelegate ShowFromFormShower;
また、リモートクラスを作成する必要があります
だから、public class FormShower : MarshalByRefObject
{
/// <summary>
/// For remote calls.
/// </summary>
public void Show()
{
if (FormShower.m == null)
throw new ApplicationException("Could not use remoting to show Main form because the reference is not set in the FormShower class.");
else
FormShower.m.Invoke(FormShower.m.ShowFromFormShower);
}
private const int PortNumber = 12312;
private static Main m = null;
public delegate void ShowFromFormShowerDelegate();
internal static void Register(Main m)
{
if (m == null) throw new ArgumentNullException("m");
FormShower.m = m;
ChannelServices.RegisterChannel(new TcpChannel(FormShower.PortNumber), false);
RemotingConfiguration.RegisterActivatedServiceType(typeof(FormShower));
}
internal static void CallShow()
{
TcpClientChannel c = new TcpClientChannel();
ChannelServices.RegisterChannel(c, false);
RemotingConfiguration.RegisterActivatedClientType(typeof(FormShower), "tcp://localhost:"+PortNumber.ToString());
FormShower fs = new FormShower();
fs.Show();
}
}
ユーザーがアプリケーションをもう一度起動しようとすると、アプリケーションがFormShower.CallShowメソッドを起動します。
これはかなりハックされた方法です。私はあなたのアプリの最初のコピーを通知するために名前付きパイプ(System.IO.Pipes
)を使用することをお勧めします。最初のコピーは、信号を受信すると、ウィンドウ自体をアクティブにします。また、アクセス許可の心配もありません。
もう1つの簡単な方法は、.NETでSystem.Threading.EventWaitHandle
クラスとして表されるWindowsイベントを使用することです。
アプリケーション内にスレッドを作成します。名前付きイベントを待つだけです。イベントが通知されると、このスレッドはForm.BeginInvoke
を使用してメインウィンドウを表示し、イベントで待機するように戻ります。
アプリケーションの新しいインスタンスから、イベントを通知するだけで済みます。
これは、パイプを使用するより少し少ない作業を必要とします。
いずれの方法(パイプ、ウィンドウ、またはイベントを使用して)でも、常にアクセス権を処理する必要があることに注意してください。
たとえば、UACが有効で、既存のアプリケーションインスタンスが管理者として実行されている場合、適切なアクセス許可を設定しない限り、新しいインスタンスがウィンドウを表示するメッセージを送信できないことがあります。あなたの方法が何であれ、パイプやイベントに)事前に
- 1. 別のフォームにフォームを表示する
- 2. C#、フォームを非表示にして別のフォームを表示する方法
- 3. ActiveAdmin:別のフォーム内にIFRAMEとしてフォームを表示
- 4. Zend Framework - 別のビューからのフォームを表示
- 5. 私のフォームに別のアプリケーションを表示する
- 6. Visual Studioなどの別のフォーム内にフォームを表示する方法
- 7. 提出されたjavascriptMVCフォームを別の部門に表示
- 8. IE7フォーム表示
- 9. UITabBarを別の表示で表示
- 10. LWUITでは、別のフォームのコンポーネントは表示されません
- 11. フォーム閉/表示 - C#
- 12. フォーム外のスプリングフォームエラーの表示
- 13. 別の画像を表示
- 14. ウェブページからフォームを表示
- 15. フォームを送信し、AJAX&PHPの別のタブにテキストボックスの値を表示
- 16. 複数の要素のビヘイビアの個別表示/非表示を個別に
- 17. Django 1.9.4別のテンプレートに表示するフォームからの入力データを取得
- 18. htmlのフォームを表示/非表示にするには?
- 19. フォームの外にContextMenuStripを表示/非表示
- 20. ストーリーボードの別の表示
- 21. 他のフォームのコントロールを表示
- 22. Git別のエディタに表示
- 23. DelphiのフォームでFlash Web Widgetを表示
- 24. vb.netのフォームにアイコンを表示
- 25. divを別のdivをクリックして表示/非表示
- 26. 連絡フォームを非表示にして確認メッセージを表示
- 27. メニュー項目をクリックしたときに別のフォーム内でフォームを表示する方法
- 28. jQueryフォームでの表示/非表示のドロップダウン
- 29. XCode IBAction別の画像を表示/非表示するNSButton?
- 30. プロジェクト全体にフォームを表示して非表示にする
実際に_your_ applicationをシングルインスタンスにしたいのですか?もしそうなら、すでにStackOverflowに関するよくある質問がたくさんあります。 – Reddog
.NETで既にサポートされています:http://social.msdn.microsoft.com/forums/en-US/winforms/thread/7c6e0d56-d942 -46f5-b27a-d627e60eebbe/ –
クール、リンクありがとう! –