본문 바로가기

.Net

단일 프로세스 실행

C#
2008. 9. 4.
안혁
http://hyok.kr


참고자료:
   http://shinbinet.zc.bz/bbs/view.php?id=ccc&no=11
   http://forum.xda-developers.com/archive/index.php/t-361997.html


기본적으로 하나의 프로그램을 개속 실행하면 실행한 만큼 프로세스가 생기지만, 특별한 경우, 한 개만 실행되고 다시 실행시킬 경우 이미 실행되어 있는 프로그램이 활성화 되었으면 하는 때도 있습니다.
아쉽게도 C#에는 윈도우 활성화(최소화 되있거나 다른 윈도우에 가려졌거나 했을 때 눈에 보여지도록 하는 것을 말함)를 시켜주는 함수가 존재하지 않습니다. 그래서 WinAPI를 사용하여 이 부분을 해결합니다.

 1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

[System.Runtime.InteropServices.DllImport("coredll.dll")]

public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

[System.Runtime.InteropServices.DllImport("coredll.dll")]

public static extern void BringWindowToTop(IntPtr hWnd);

[System.Runtime.InteropServices.DllImport("coredll.dll")]

public static extern void SetForegroundWindow(IntPtr hWnd);

[System.Runtime.InteropServices.DllImport("coredll.dll")]

public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);

 

/// <summary>

/// 해당 응용 프로그램의 주 진입점입니다.

/// </summary>

[MTAThread]

static void Main()

{

    string rt = "HyokMain"; //실행파일의 Caption

 

    // 최상위화면으로

    IntPtr wHandle = FindWindow(null, rt);

    if (wHandle != IntPtr.Zero)

    {

        ShowWindow(wHandle, 5);

        BringWindowToTop(wHandle);

        SetForegroundWindow(wHandle);

    }

    else

    {

        Application.Run(new HyokAppMain());

    }

}


윈도우 어플리케이션을 생성하면 program.cs라는 파일이 생기고, 그 안에서 Main 함수가 있는 클래스를 발견할 수 있습니다. 1~8줄이 WinAPI 함수를 Import하는 부분이다. coredll.dll을 Import하는데, 이는 .Net Compact Framework를 대상으로 할 때 사용하는 dll입니다. 일반 윈도우에서 동일한 기능을 구현하고자 한다면 coredll.dll 대신 user32.dll을 기입하면 되며, 19~20줄에서 프로그램 실행 여부를 확인 후 활성화(22~24줄) 또는 실행(28줄)하게 됩니다.

'.Net' 카테고리의 다른 글

CryptographicException: Event code 3005  (0) 2009.10.30
HTML에서 특수 기호 인코딩의 필요성  (0) 2009.08.19