Можно ли полностью запретить множественные экземпляры в .NET Compact Framework? - PullRequest
2 голосов
/ 19 сентября 2011

Поскольку я пробовал много способов остановить проблему с несколькими экземплярами на портативном устройстве, работающем на .net compact framework 3.5.

В настоящее время я получил решение, создав «Mutex» и проверив, запущен ли тот же процесс. Я поместил это утверждение в «Program.cs», который будет выполняться в первый раз при запуске программы.

Но я думаю, что это не решает мои проблемы, потому что я получил запрос от пользователя, что ему нужно отключить "значок программы" во время работы.

Я понимаю, что пользователь иногда может «открыть» программу несколько раз или более за короткий период. Так что, если он еще в состоянии «открыть». Это означает, что программа должна будет инициализироваться сама и, возможно, в конечном итоге потерпит неудачу. Можно ли абсолютно предотвратить множественный экземпляр? или есть другой способ без программирования, как редактирование реестра в Windows CE?


Вот мой исходный код:

bool firstInstance;
NamedMutex mutex = new NamedMutex(false, "MyApp.exe", out firstInstance);

if (!firstInstance)
{
    //DialogResult dialogResult = MessageBox.Show("Process is already running...");
    Application.Exit();
}

NamedMutex - это класс из OpenNetCF.

1 Ответ

5 голосов
/ 20 сентября 2011

Ваш код почти в порядке.единственное, чего не хватает, это удалить выход из приложения и поместить туда код, необходимый для того, чтобы вывести текущий работающий экземпляр поверх.я делал это в прошлом, поэтому вам не нужно отключать или скрывать значок, вы просто обнаруживаете уже запущенный экземпляр и выводите его на передний план.

Edit:

здесь фрагмент кода:

[DllImport("coredll.dll")]
private static extern IntPtr FindWindow(IntPtr className, string windowName);

[DllImport("coredll.dll")]
internal static extern int SetForegroundWindow(IntPtr hWnd);

[DllImport("coredll.dll")]
private static extern bool SetWindowPos(IntPtr hwnd, int hwnd2, int x,int y, int cx, int cy, int uFlags);

if (IsInstanceRunning())
{
    IntPtr h = FindWindow(IntPtr.Zero, "Form1");
    SetForegroundWindow(h);
    SetWindowPos(h, 0, 0, 0, Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height, 0x0040);

    return;
}

проверьте эти ссылки для получения дополнительной информации ...

http://www.nesser.org/blog/archives/56 (включая комментарии)

Что такоелучший способ сделать приложение на единственном экземпляре в Compact Framework?

...