[Mono-list] howto don't allow to execute program two times?
Xavi de Blas
xaviblas at gmail.com
Fri Sep 21 10:47:12 EDT 2007
Thanks Eric, this will be nice if it's ported to Mono.
Now i think i will create a file when it's running. And delete when
program exits.
Everytime that program starts i will see if file is created. And if
it's created it will ask the user if it has two instances or if
program crashed.
Is not perfect but i hope it works
Thanks again
2007/9/19, Engler, Eric <Eric.Engler at zcsterling.com>:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> I am not doing this in Mono yet, but here's the code I have for Windows.
>
> This code came from here:
> http://www.personalmicrocosms.com/html/dotnettips.html
>
> The first function detects if another instance is running. The caller of
> this function can then take action: typically he'll just end his own
> program. Or he may want to pop-up the other instance that's already
> running before he exits (far less portable - see below).
>
> This function uses a Mutex, which may be portable to Mono:
>
> private static Mutex mutex = null;
>
> // Determine if the current process is already running
> public static bool ThisProcessIsAlreadyRunning()
> {
> // Only want to call this method once, at startup.
> Debug.Assert(mutex == null);
> // createdNew needs to be false in .Net 2.0, otherwise, if another
> instance of
> // this program is running, the Mutex constructor will block, and then
> throw
> // an exception if the other instance is shut down.
> bool createdNew = false;
> mutex = new Mutex(false, "PgmName Mutex", out createdNew);
>
> Debug.Assert(mutex != null);
> return !createdNew;
> }
>
> Here's the Windows code that can be used to pop-up the other instance.
> This is full of non-portable API calls, so I hope someone can help to
> make these work with Mono:
>
> [DllImport("user32.dll", SetLastError = true)]
> static extern int FindWindow(string lpClassName, string lpWindowName);
>
> [DllImport("user32.dll")]
> [return: MarshalAs(UnmanagedType.Bool)]
> static extern bool SetForegroundWindow(int hWnd);
>
> [DllImport("user32.dll")]
> static extern bool IsIconic(int hWnd);
>
> [DllImport("user32.dll")]
> static extern bool ShowWindow(int hWnd, int nCmdShow);
>
> const int SW_RESTORE = 9;
>
> [DllImport("user32.dll")]
> static extern int GetLastActivePopup(int hWnd);
>
> [DllImport("user32.dll")]
> static extern bool IsWindowEnabled(int hWnd);
>
> // Set focus to the previous instance of the specified program.
> public static void SetFocusToPreviousInstance(string windowCaption)
> {
> // Look for previous instance of this program.
> int hWnd = FindWindow(null, windowCaption);
> // If a previous instance of this program was found...
> if (hWnd != 0)
> {
> // Is it displaying a popup window?
> int hPopupWnd = GetLastActivePopup(hWnd);
> // If so, set focus to the popup window. Otherwise set focus
> // to the program's main window.
> if (hPopupWnd != 0 && IsWindowEnabled(hPopupWnd))
> {
> hWnd = hPopupWnd;
> }
> SetForegroundWindow(hWnd);
> // If program is minimized, restore it.
> if (IsIconic(hWnd))
> {
> ShowWindow(hWnd, SW_RESTORE);
> }
> }
> }
>
>
>
> -----BEGIN PGP SIGNATURE-----
> Version: PGP Universal 2.6.2
> Charset: us-ascii
>
> wsBVAwUBRvGRlchfyUs+le7yAQg2jQf/Ztv7vtCZmIyee579J+MI9Ta3PbyXodep
> eWj+/b+LTfFa9WrLbiqyUdfKZxjBImX2ZoPAfcu198YFBJuNoerPXG02dX93Butq
> cREw3FnwxznLuGUgdTIJWVzrO2Hr80hRGTs4qLVAwHTczOGLzTbvqFWYu9t1qgdh
> 89S5tqTTme30T+rFOM8Mqjo7dtj1ZnFl22LhEH7BVMLxpM5LwYZQmO3R5cmDZnzo
> gudKuml7vrQjEtZInZDePGC1l4kSBIqAIvOgWwAohTx+ZSSpx9aK5fNHhgK9zkZw
> 4A7Tkuh9D1VNIGTyT8lobCj8feN9GpVy5phhfbryNpWFMHz3GR78pQ==
> =r6o/
> -----END PGP SIGNATURE-----
> _______________________________________________
> Mono-list maillist - Mono-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
>
More information about the Mono-list
mailing list