免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
オンラインプログラムを実行するためのC#シングルトン方法については比較的簡単で、いくつかの機能を実現させるためにも、できない、自分の前に、サードパーティがDevExpress社、シングルトンも自分自身を実行するためにそれを使用するコントロールを使用しているので、彼らは、ポストをテストするためにしようとしていないかわかりませんメソッドが付属し、この方法はDevExpress.DevAV.v17.1.Data.dll DevExpress社を参照する必要があると呼ばれています
-
static void Main()
-
{
-
var appName= Process.GetCurrentProcess().ProcessName;
-
using (DevExpress.Internal.DevAVDataDirectoryHelper.SingleInstanceApplicationGuard(appName,
out exit))
-
{
-
if (exit)
-
return;
-
Application.EnableVisualStyles();
-
Application.SetCompatibleTextRenderingDefault(
false);
-
Application.Run(
new Form1());
-
}
-
}
レイジー前に、すぐテイク棚を参照してください、だけでなく、具体的な実現方法について考えていなかった、誰かがソースを見て行くことを決定する前に、尋ねた。この方法は、もともと瞬間の統合を達成するためにミューテックスを使用したDevExpress社を見つけましたデータ、操作の一般的なシングルトンメソッドの再書き込みのC#デスクトップアプリケーション、次のように:
次の名前空間を参照する必要があります:
-
using
System;
-
using
System
.Diagnostics;
-
using
System
.Drawing;
-
using
System
.Runtime
.InteropServices;
-
using
System
.Security;
-
using
System
.Threading;
-
/// <summary>
-
/// 单实例应用程序--by涛神
-
/// </summary>
-
public
class
SingleInstanceApplication
-
{
-
/// <summary>
-
/// 判断应用是否运行
-
/// </summary>
-
/// <param name="processName"></param>
-
/// <param name="exit"></param>
-
/// <returns></returns>
-
public static IDisposable Guard(out bool exit)
-
{
-
Process currentProcess = Process.GetCurrentProcess();
-
var processName = currentProcess.ProcessName;
-
Mutex mutex =
new Mutex(
true, processName,
out
bool createNew);
-
if (createNew)
-
{
-
exit =
false;
-
}
-
else
-
{
-
Process[] processesByName = Process.GetProcessesByName(currentProcess.ProcessName);
-
int num =
0;
-
while (num < (
int)processesByName.Length)
-
{
-
Process process = processesByName[num];
-
if (process.Id == currentProcess.Id || !(process.MainWindowHandle != IntPtr.Zero))
-
{
-
num++;
-
}
-
else
-
{
-
WinApiHelper.SetForegroundWindow(process.MainWindowHandle);
-
WinApiHelper.RestoreWindowAsync(process.MainWindowHandle);
-
break;
-
}
-
}
-
exit =
true;
-
}
-
return mutex;
-
}
-
private
static
class
WinApiHelper
-
{
-
[
SecuritySafeCritical]
-
public static bool IsMaxmimized(IntPtr hwnd)
-
{
-
WinApiHelper.Import.WINDOWPLACEMENT wINDOWPLACEMENT =
new WinApiHelper.Import.WINDOWPLACEMENT();
-
if (!WinApiHelper.Import.GetWindowPlacement(hwnd,
ref wINDOWPLACEMENT))
-
{
-
return
false;
-
}
-
return wINDOWPLACEMENT.showCmd == WinApiHelper.Import.ShowWindowCommands.ShowMaximized;
-
}
-
-
[
SecuritySafeCritical]
-
public static bool RestoreWindowAsync(IntPtr hwnd)
-
{
-
return WinApiHelper.Import.ShowWindowAsync(hwnd, (WinApiHelper.IsMaxmimized(hwnd) ?
3 :
9));
-
}
-
-
[
SecuritySafeCritical]
-
public static bool SetForegroundWindow(IntPtr hwnd)
-
{
-
return WinApiHelper.Import.SetForegroundWindow(hwnd);
-
}
-
-
private
static
class
Import
-
{
-
[
DllImport("user32.dll", CharSet = CharSet.None, ExactSpelling = false)]
-
public static extern bool GetWindowPlacement(IntPtr hWnd, ref WinApiHelper.Import.WINDOWPLACEMENT lpwndpl);
-
-
[
DllImport("user32.dll", CharSet = CharSet.None, ExactSpelling = false)]
-
public static extern bool SetForegroundWindow(IntPtr hWnd);
-
-
[
DllImport("user32.dll", CharSet = CharSet.None, ExactSpelling = false)]
-
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
-
-
public
enum ShowWindowCommands
-
{
-
Hide,
-
Normal,
-
ShowMinimized,
-
ShowMaximized,
-
ShowNoActivate,
-
Show,
-
Minimize,
-
ShowMinNoActive,
-
ShowNA,
-
Restore,
-
ShowDefault,
-
ForceMinimize
-
}
-
-
public
struct WINDOWPLACEMENT
-
{
-
public
int length;
-
-
public
int flags;
-
-
public WinApiHelper.Import.ShowWindowCommands showCmd;
-
-
public Point ptMinPosition;
-
-
public Point ptMaxPosition;
-
-
public Rectangle rcNormalPosition;
-
}
-
}
-
}
-
}
議論の場合は、以下のコールデモ、プロテストを実現することができない、メッセージを残してください(この記事はオリジナル記事です再現、予約海賊版、その記事は、ありがとう、あなたは賞賛のサポートを指し示すことができますしてください)。
-
static void Main()
-
{
-
using(SingleInstanceApplication.Guard(out
bool
exit))
-
{
-
if (
exit)
-
return;
-
Application.EnableVisualStyles();
-
Application.SetCompatibleTextRenderingDefault(
false);
-
Application.Run(
new Form1());
-
}
-
}