Запрет повторного запуска программы в Windows CE (C# CF)

Apr 20, 2011 11:21

Что мы имеем?
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;

c#, работа, visual studio

Previous post Next post
Up