Это не работает, потому что ваше объявление CreateMutex не находится в пространстве имен Win32Calls. Ваша следующая проблема заключается в том, что он все равно не будет работать, потому что вы забыли установить свойство SetLastError в атрибуте [DllImport]. Требуется, чтобы Marshal.GetLastWin32Error () возвращал ошибку.
Немного перемотав, использование класса Mutex в Win7 должно работать без проблем. Единственный способ сбоя, о котором я могу подумать, - это не добавлять префикс имени мьютекса к «Global \», чтобы мьютекс был виден во всех сеансах. Это немного отдаленно.
Более того, вы пытаетесь сделать что-то, что уже очень хорошо поддерживается в .NET Framework. Проект + Добавить ссылку, выберите Microsoft.VisualBasic. Сделайте так, чтобы ваш код Program.cs выглядел так:
using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;
namespace WindowsFormsApplication1 {
class Program : WindowsFormsApplicationBase {
[STAThread]
static void Main(string[] args) {
var prog = new Program();
prog.EnableVisualStyles = true;
prog.IsSingleInstance = true;
prog.MainForm = new Form1();
prog.Run(args);
}
}
}
Преимуществом этого подхода является то, что он автоматически устанавливает фокус на работающий экземпляр вашей программы, когда пользователь запускает его снова. И вы можете переопределить метод OnStartupNextInstance, чтобы узнать, какие аргументы командной строки были использованы, и ответить соответствующим образом.