단일 Winform Application

최용국·2020년 6월 7일
0

관용구

목록 보기
9/9

20-0607 단일 Winform Application

Winform 작업을 하다보면 내가 만든 Application이 실행되고 있으면 새로운 Application이 뜨는 것이 아니라 기존의 Application을 보여줌으로써 여러개가 실행되는 것을 막고싶을 때가 있다. 그럴때 Mutex를 이용해 프로세스간 동기화를하고 Win32Api를 사용해 실행되고 있는 Application을 최상단으로 보여주면 된다.

Program.cs

static class Program
{
    public const int HWND_BROADCAST = 0xffff;

    public static readonly int WM_SHOWME = RegisterWindowMessage("WM_SHOWME");

    [DllImport("user32")]
    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
    [DllImport("user32")]
    public static extern int RegisterWindowMessage(string message);

    static string MainMutex = "{1DEB3C7C-EAF3-4212-9099-D56A9BB5D883}";
    static MainForm MainForm { get; set; }
    /// <summary>
    /// 해당 애플리케이션의 주 진입점입니다.
    /// </summary>
    [STAThread]
    static void Main()
    {
        using (Mutex mutex = new Mutex(true, MainMutex, out bool createNew))
        {
            if (createNew)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                MainForm = new MainForm();

                //app start
                Application.Run(MainForm);
            }
            else
            {
                PostMessage((IntPtr)HWND_BROADCAST,
                    WM_SHOWME,
                    IntPtr.Zero,
                    IntPtr.Zero);
            }
        }
    }
}

MainForm.cs

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == Program.WM_SHOWME)
            ShowMe();
    }

    private void ShowMe()
    {
        if (this.WindowState == FormWindowState.Minimized)
            this.WindowState = FormWindowState.Normal;

        TopMost = true;
    }
}

소스 위치
github: https://github.com/opzerg/YGStudy.git
solution: 관용구
project SingleApp

profile
코딩합시다.

0개의 댓글