現在のプロセス名を確認したり、グローバル ファイルを使用したりしたくないとおっしゃいました。
現在の実行可能ファイルをロックする
.NET サンプル コード:
System.IO.File.Open(
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName,
System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.None);
FileShare.None は、アプリが終了するか、ファイル ハンドル (返されるオブジェクト) が明示的に閉じられるまで、他のプロセス (Windows エクスプローラーなど) がファイルを実行できないようにします。
グローバル ミューテックス
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682411%28v=vs.85%29.aspx
ミューテックスが名前付きミューテックスであり、この関数呼び出しの前にオブジェクトが存在していた場合、戻り値は既存のオブジェクトへのハンドルであり、GetLastError は ERROR_ALREADY_EXISTS を返し、bInitialOwner は無視され、呼び出しスレッドには所有権が付与されません。ただし、呼び出し元のアクセス権が制限されている場合、関数は ERROR_ACCESS_DENIED で失敗し、呼び出し元は OpenMutex 関数を使用する必要があります。
グローバルミューテックスは最も簡単な方法です。別の答えを明確にするために、戻り値をチェックするだけでなく、GetLastError 値もチェックします。