最近、Winフォームのプログラムをやって、あなただけが既に存在する場合、プログラムのウィンドウが起動され、最前面に表示され、プログラムを開く必要があります。オンラインカザフグーグル、ソリューションの多くを発見しました。ここで私は共有するための3つのプログラムの種類、およびテストされ、そして友人を一緒に入れ:
まず、ミューテックスを使用して(System.Threading.Mutex)
同期プリミティブは、唯一のスレッドに共有リソースへの排他的アクセスを許可されました。プログラムが起動すると、我々は指定された排他的、就任の実行のインスタンスへのアクセスを得ることができれば、それは、ミューテックスを要求します。
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
BOOL createNew;
使用(System.Threading.Mutexミューテックス=新しいSystem.Threading.Mutex(真、Application.ProductName、createNew)OUT)
{
IF(createNew)
{
Application.Run(新しいForm1の())。
}
他
{
MessageBox.Show( "应用程序已经在运行中...")
使用(System.Threading.Mutexミューテックス=新しいSystem.Threading.Mutex(真、Application.ProductName、createNew)OUT)
{
IF(createNew)
{
Application.Run(新しいForm1の())。
}
他
{
MessageBox.Show( "应用程序已经在运行中...")
System.Threading.Thread.Sleep(1000);
System.Environment.Exit(1)。
}
}
System.Environment.Exit(1)。
}
}
第二に、プロセス名を使用します
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
プロセス[] = System.Diagnostics.Process.GetProcessesByNameプロセス(Application.CompanyName);
IF(processes.Length> 1)
{
MessageBox.Show( "アプリケーションが既に実行されている..");
のThread.sleep(1000);
System.Environment.Exit(1);
}
他
{
Application.Run(新しい新規のForm1());
}
IF(processes.Length> 1)
{
MessageBox.Show( "アプリケーションが既に実行されている..");
のThread.sleep(1000);
System.Environment.Exit(1);
}
他
{
Application.Run(新しい新規のForm1());
}
第三に、のWin32 APIを呼び出し、アクティブ化すると、プログラムウィンドウを最前面に表示されます
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
///この関数は、ウィンドウが別のスレッドの表示状態によって生成される設定
/// </要約>
/// <PARAM NAME = "のhWnd">ウィンドウハンドル</ PARAM>
/// <PARAM NAME = "ncmdshowは、">どのようにウィンドウの表示を指定します。許可された値のリストを参照し、ShowWlndow </ PARAM>関数の説明のセクションを参照してください
、戻り値はゼロ</戻り>本来隠さ関数である場合; /// <戻り値>可視本来の機能は、戻り値がある場合にゼロ
[DLLIMPORTを( 「User32.dllの」)]
ncmdshowのINTのためのhWndのIntPtr ShowWindowAsync BOOLプライベート静的にextern();
/// <まとめ>
///この関数は、スレッドが前景に指定されたウィンドウを設定し、ウィンドウがアクティブに作成します。キーボード入力ウィンドウをステアリング、そしてユーザーのために、様々な視覚的なマークを変更します。
///フォアグラウンドウィンドウシステムは、他のスレッドよりわずかに高いスレッド割り当てられた権限を作成します。
/// </要約>
/// <PARAM NAME = "hWndは"> </ param>の最前面ウィンドウのハンドルに活性化して転送されます
。<戻り値> ///
[DLLIMPORT( "User32.dllの")]
プライベート静的にexternのブールSetForegroundWindow(のIntPtrのhWnd)。
/// </要約>
/// <PARAM NAME = "のhWnd">ウィンドウハンドル</ PARAM>
/// <PARAM NAME = "ncmdshowは、">どのようにウィンドウの表示を指定します。許可された値のリストを参照し、ShowWlndow </ PARAM>関数の説明のセクションを参照してください
、戻り値はゼロ</戻り>本来隠さ関数である場合; /// <戻り値>可視本来の機能は、戻り値がある場合にゼロ
[DLLIMPORTを( 「User32.dllの」)]
ncmdshowのINTのためのhWndのIntPtr ShowWindowAsync BOOLプライベート静的にextern();
/// <まとめ>
///この関数は、スレッドが前景に指定されたウィンドウを設定し、ウィンドウがアクティブに作成します。キーボード入力ウィンドウをステアリング、そしてユーザーのために、様々な視覚的なマークを変更します。
///フォアグラウンドウィンドウシステムは、他のスレッドよりわずかに高いスレッド割り当てられた権限を作成します。
/// </要約>
/// <PARAM NAME = "hWndは"> </ param>の最前面ウィンドウのハンドルに活性化して転送されます
。<戻り値> ///
[DLLIMPORT( "User32.dllの")]
プライベート静的にexternのブールSetForegroundWindow(のIntPtrのhWnd)。
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
民間のconst int型SW_SHOWNOMAL = 1;
プライベート静的ボイドHandleRunningInstance(プロセスインスタンス)
{
ShowWindowAsync(instance.MainWindowHandle、SW_SHOWNOMAL); //显示
SetForegroundWindow(instance.MainWindowHandle); //当到最前端
}
プライベート静的プロセスRuningInstance()
{
プロセスcurrentProcess = Process.GetCurrentProcess() ;
プロセス[]プロセス= Process.GetProcessesByName(currentProcess.ProcessName)。
foreachの(プロセスにおけるプロセス工程)
{
IF(process.Id!= currentProcess.Id)
{
IF(。Assembly.GetExecutingAssembly()Location.Replace( "/"、 "\\")== currentProcess.MainModule.FileName)
{
戻り工程;
}
}
}
はnullを返します。
}
プライベート静的ボイドHandleRunningInstance(プロセスインスタンス)
{
ShowWindowAsync(instance.MainWindowHandle、SW_SHOWNOMAL); //显示
SetForegroundWindow(instance.MainWindowHandle); //当到最前端
}
プライベート静的プロセスRuningInstance()
{
プロセスcurrentProcess = Process.GetCurrentProcess() ;
プロセス[]プロセス= Process.GetProcessesByName(currentProcess.ProcessName)。
foreachの(プロセスにおけるプロセス工程)
{
IF(process.Id!= currentProcess.Id)
{
IF(。Assembly.GetExecutingAssembly()Location.Replace( "/"、 "\\")== currentProcess.MainModule.FileName)
{
戻り工程;
}
}
}
はnullを返します。
}
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
= RuningInstanceプロセス工程();
IF(プロセス== NULL)
{
Application.Run(新しい新しいForm1が());
}
他
{
MessageBox.Showは( "アプリケーションが既に実行されています...")。
IF(プロセス== NULL)
{
Application.Run(新しい新しいForm1が());
}
他
{
MessageBox.Showは( "アプリケーションが既に実行されています...")。
HandleRunningInstance(プロセス)。
//System.Threading.Thread.Sleep(1000);
//System.Environment.Exit(1);
}
//System.Threading.Thread.Sleep(1000);
//System.Environment.Exit(1);
}