>  기사  >  백엔드 개발  >  C#에서는 WinFrom 프로세스를 시작하는 두 가지 방법만 허용합니다.

C#에서는 WinFrom 프로세스를 시작하는 두 가지 방법만 허용합니다.

黄舟
黄舟원래의
2016-12-21 14:43:441873검색

방법 1: 여러 프로세스만 실행 금지

clipboardPRint로 일반 복사본 보기
·········10·······20····· ···30········40········50·······60·········70········80 ·········90········100·······110·······120········130······ ·140· ······150
[STAThread]
public static void Main()
{
bool ret
System.Threading.Mutex mutex = new System.Threading. Mutex(true , application.ProductName, out ret);
if (ret)
{ System.Windows.Forms.Application.EnableVisualStyles(); //이 두 줄은 XP 시각적 스타일을 구현합니다.
System. .Forms.Application.DoEvents();
System.Windows.Forms.Application.Run(new Main())
// Main이 프로그램의 기본 형식입니다. 이 문장을 사용하지 마세요           이 프로그램이 종료됩니다. ", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
// 프롬프트 메시지는 삭제할 수 있습니다.
Application.Exit();//프로그램 종료 .Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out ret);
if (ret)
{
System.Windows.Forms.Application.EnableVisualStyles(); / /이 두 줄은 XP 시각적 스타일을 구현합니다.
System.Windows.Forms.Application.DoEvents();
System.Windows.Forms.Application.Run( new Main());
// Main은 프로그램의 주요 형태입니다. 콘솔 프로그램인 경우 이 문장을 사용하지 마세요.  
                                같은 애플리케이션이 이미 실행 중이므로 한 번에 여러 프로그램을 실행하지 마세요. 같은 시간입니다. 이 프로그램이 곧 종료됩니다.
Application.Exit();//프로그램 종료
}
}


방법 2: 여러 프로세스 실행을 비활성화하고, 반복 실행 시 이전 프로세스 활성화

클립보드 인쇄로 일반 사본을 보시겠습니까?
·········10········20·········30········40 ·········50········60········70·······80·········90·· ···· ··100········110········120········130········140······· 150
[STAThread]
public static void Main()
{ //실행 중인 인스턴스를 가져옵니다.
프로세스 인스턴스 = RunningInstance()
if (instance == null)
{ System .Windows.Forms.Application.EnableVisualStyles(); //이 두 줄은 XP 시각적 스타일을 구현합니다.
        System.Windows.Forms.Application.DoEvents();   
        //여기에는   다른   예가 없습니다.   양식을 보여주세요.      
        Application.Run(new Main());   
    }   
    else  
    {   
        //이 프로세스의 또 다른 인스턴스가   있습니다.      
        HandleRunningInstance(인스턴스);   
    }   
}   
공개 정적 프로세스 RunningInstance()   
{   
    프로세스 현재 = Process.GetCurrentProcess();   
    프로세스[] 프로세스 = Process.GetProcessesByName(current.ProcessName);   
    //루프   실행 중인   프로세스를 통해   동일한   이름      
    foreach(프로세스의 프로세스 프로세스)   
    {   
        //현재   무시   프로세스      
        if (process.Id != current. Id)   
        {   
            //프로세스가   exe 파일에서   실행되고 있는지   확인하세요.      
            if (Assembly.GetExecutingAssembly().Location.Replace("/", "\") == current.MainModule.FileName)   
           {   
              //반환      프로세스   인스턴스.      
                반품 절차;   
            }   
        }   
    }   
    //아니요   다른   인스턴스를 찾았습니다.   찾았으며   반환   null입니다.    
    null을 반환합니다.   
}   
public static void HandleRunningInstance(프로세스 인스턴스)   
{   
    //창이 최소화되지 않았는지 확인하세요. 파일, WS_SHOWNORMAL);   
    //설정   실제 인스턴스를   전경으로 설정   창   
    SetForegroundWindow(instance.MainWindowHandle);   
}   
[DllImport("User32.dll")]   
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);   
[DllImport("User32.dll")]   
private static extern bool SetForegroundWindow(IntPtr hWnd);   
비공개 const int WS_SHOWNORMAL = 1;  
[STAThread]
public static void Main()
{
    //실행 중인 인스턴스를 가져옵니다.   
    프로세스 인스턴스 = RunningInstance();
    if (인스턴스 == null)
    {
        System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格   
        System.Windows.Forms.Application.DoEvents();
        //여기에는   다른 인스턴스가 없습니다.   양식을 보여주세요.   
        Application.Run(new Main());
    }
    else
    {
        //이 프로세스의 또 다른 인스턴스가   있습니다.   
        HandleRunningInstance(인스턴스);
    }
}
public static Process RunningInstance()
{
    현재 프로세스 = Process.GetCurrentProcess();
    프로세스[] 프로세스 = 프로세스 .GetProcessesByName(current.ProcessName);
    //루프   실행 중인   프로세스를 통해   에서   동일한 이름   
    foreach(프로세스의 프로세스 프로세스)
    {
        //무시   현재의   프로세스   
        경우에 (process.Id != current.Id)
        {
            //프로세스가   exe 파일에서 실행되고 있는지   확인하세요.   
            if (Assembly.GetExecutingAssembly().Location.Replace("/", "\") == current.MainModule.FileName)
           {
              //반환      기타   프로세스   인스턴스.   
               반품 프로세스;
            }
        }
    }
    //아니요   다른   인스턴스가   발견되었습니다.   반환   null입니다. 
    null 반환;
}
public static void HandleRunningInstance(프로세스 인스턴스)
{
    //창이 최소화되지 않았는지 확인하세요. owHandle, WS_SHOWNORMAL) ;
    //실제 인스턴스를   전경으로 설정합니다. 포인트 hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
private const int WS_SHOWNORMAL = 1; 



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.