Что мы имеем?
1. Задача №1: запретить повторный запуск программы в Windows CE
2. Задача №2: при повторном запуске активировать (показать) окно запущенного приложения
3. язык: C#
4. среда: Visual Studio 2008 (Compact Framework 3.5)
Что у меня получилось:
static class Program
{
///
/// The main entry point for the application.
///
public const Int32 NATIVE_ERROR_ALREADY_EXISTS = 183;
[DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool InitialOwner, string MutexName );
[DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true )]
public static extern bool ReleaseMutex(IntPtr hMutex);
[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);
///
/// Проверка выполнения программы, возвращает true если приложение уже запущено
///
public static bool IsInstanceRunning()
{
string appName = System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString();
IntPtr hMutex = CreateMutex(IntPtr.Zero, true, appName);
if (Marshal.GetLastWin32Error() == NATIVE_ERROR_ALREADY_EXISTS) return true; else return false;
}
[MTAThread]
static void Main()
{
if (IsInstanceRunning())
{
string mainFormCaption = "Вход в программу";
MessageBox.Show("Программа уже запущена!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
IntPtr h = FindWindow(IntPtr.Zero, mainFormCaption);
SetForegroundWindow(h);
SetWindowPos(h, 0, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, 0x0040);
} else Application.Run(
new fmLogin());
}
}
Не забудьте указать:
using System.Runtime.InteropServices;