Click to See Complete Forum and Search --> : Single instance app refocus in c#?


definition
January 30th, 2006, 04:39 AM
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;

//[assembly: CLSCompliant(true)]
namespace SmsConnect
{
static class Program
{

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(ref string lpClassName, ref string lpWindowName);

private enum WindowShowStyle : uint
{
/// <summary>Hides the window and activates another window.</summary>
/// <remarks>See SW_HIDE</remarks>
Hide = 0,
/// <summary>Activates and displays a window. If the window is minimized
/// or maximized, the system restores it to its original size and
/// position. An application should specify this flag when displaying
/// the window for the first time.</summary>
/// <remarks>See SW_SHOWNORMAL</remarks>
ShowNormal = 1,
/// <summary>Activates the window and displays it as a minimized window.</summary>
/// <remarks>See SW_SHOWMINIMIZED</remarks>
ShowMinimized = 2,
/// <summary>Activates the window and displays it as a maximized window.</summary>
/// <remarks>See SW_SHOWMAXIMIZED</remarks>
ShowMaximized = 3,
/// <summary>Maximizes the specified window.</summary>
/// <remarks>See SW_MAXIMIZE</remarks>
Maximize = 3,
/// <summary>Displays a window in its most recent size and position.
/// This value is similar to "ShowNormal", except the window is not
/// actived.</summary>
/// <remarks>See SW_SHOWNOACTIVATE</remarks>
ShowNormalNoActivate = 4,
/// <summary>Activates the window and displays it in its current size
/// and position.</summary>
/// <remarks>See SW_SHOW</remarks>
Show = 5,
/// <summary>Minimizes the specified window and activates the next
/// top-level window in the Z order.</summary>
/// <remarks>See SW_MINIMIZE</remarks>
Minimize = 6,
/// <summary>Displays the window as a minimized window. This value is
/// similar to "ShowMinimized", except the window is not activated.</summary>
/// <remarks>See SW_SHOWMINNOACTIVE</remarks>
ShowMinNoActivate = 7,
/// <summary>Displays the window in its current size and position. This
/// value is similar to "Show", except the window is not activated.</summary>
/// <remarks>See SW_SHOWNA</remarks>
ShowNoActivate = 8,
/// <summary>Activates and displays the window. If the window is
/// minimized or maximized, the system restores it to its original size
/// and position. An application should specify this flag when restoring
/// a minimized window.</summary>
/// <remarks>See SW_RESTORE</remarks>
Restore = 9,
/// <summary>Sets the show state based on the SW_ value specified in the
/// STARTUPINFO structure passed to the CreateProcess function by the
/// program that started the application.</summary>
/// <remarks>See SW_SHOWDEFAULT</remarks>
ShowDefault = 10,
/// <summary>Windows 2000/XP: Minimizes a window, even if the thread
/// that owns the window is hung. This flag should only be used when
/// minimizing windows from a different thread.</summary>
/// <remarks>See SW_FORCEMINIMIZE</remarks>
ForceMinimized = 11
}

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow);

/// <summary>
/// The main entry point for the application.
/// </summary>

[MTAThread]
static void Main(string[] args)
{
// System.Threading.Thread.CurrentThread.CurrentUICulture =
// new System.Globalization.CultureInfo("fr");

// Open or create named mutex
Mutex pMutex = new Mutex(false, "some_uniqe_name");

// Get ownershiip of mutex
if (!pMutex.WaitOne(0, false))
{
// Mutex owned by someone else
string appName = "MyApp";
string windowName = null;

ShowWindow(FindWindow(ref appName, ref windowName), WindowShowStyle.Restore);

//MessageBox.Show("App already running!");
return;
}
else
{
Form1 newform = new Form1();
// Here goes you Application.Run(...) etc.
Application.EnableVisualStyles();
Application.Run(newform);

// release mutex when done...
pMutex.ReleaseMutex();
return;
}

}
}
}


Can anyone tell my why this doesnt, or how i can refocus an the already running instance of an application if the user attempts to start another instance?

stepi
January 30th, 2006, 07:04 AM
Hi there,
Change the signature to the ShowWindow method to
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow( string lpClassName, string lpWindowName);
Next step, add this
[DllImport("User32")]
private static extern int SetForegroundWindow(IntPtr hwnd);

Then change your code to with this:

if (!pMutex.WaitOne(0, false))
{
// Mutex owned by someone else

string windowName = "Your FORM text title";

IntPtr hWnd = FindWindow(null, windowName);
if (hWnd != IntPtr.Zero)
{
ShowWindow(hWnd, WindowShowStyle.Restore );
SetForegroundWindow(hWnd);
// MessageBox.Show("App already running!" );
}
else
{
//MessageBox.Show("could not find window");
}

}
else
{
...................................

Bye

definition
January 30th, 2006, 07:37 AM
thank you mysterious stranger :P