Winform 응용 프로그램의 단일 루틴

WinFrom 개발 을 할 때, 우 리 는 하나의 규칙 (routine) 만 실행 하고 싶다 고 생각 할 때 가 많다.디자인 모델 의 Single Pattern 처럼 그 원 리 는 대체로 같다.
그럼 싱글 패턴 의 실현 원 리 를 살 펴 보 자.

  
  
  
  
  1. public class SinglePattern  
  2. {  
  3.     private static SinglePattern instance = null;  
  4.  
  5.     public static SinglePattern Instance()  
  6.     {  
  7.         if (instance == null)  
  8.         {  
  9.             instance = new SinglePattern();  
  10.         }  
  11.         return instance;  
  12.     }  

이러한 가장 기본 적 인 단일 예 모드 에서 정적 변수 인 스 턴 스 를 사용 하여 SinglePattern 의 인 스 턴 스 를 저장 합 니 다.어쨌든 우리 프로그램 에 서 는 하나의 인 스 턴 스 만 있 고 이 를 통 해 SinglePattern. Instance () 방법 으로 돌아 오 는 인 스 턴 스 가 단일 인 스 턴 스 임 을 확인 하 였 습 니 다.
그러면 우 리 는 어떻게 WinForm 에서 Form 에 단일 창 을 만 들 수 있 습 니까?
조롱박 이 바 가 지 를 그 리 는 것 보다 정적 변수 와 유사 한 것 을 찾 아 존재 하 는 것 을 확인 해 야 한다.
  • 파일 시스템 의 파일, 통 일 된 경로 에 이름 이 바 뀌 지 않 은 파일 (확장자 포함).
  • 다 중 스 레 드 중의 Mutex 는 운영 체제 등급 에서 도 유일 하 다.

  • 파일 로 WinFrom 를 어떻게 실현 하 는 지 는 여기 서 더 이상 말 하지 않 겠 습 니 다.예 를 들 어 Mutex 를 어떻게 사용 하여 WinForm 을 실현 하 는 단일 예 를 들 어 보 자.
    
      
      
      
      
    1. bool isNew = false;  
    2. Mutex mutext = new Mutex(true"testFrom"out isNew); 

    testform 이라는 Mutext 가 존재 할 때 isNew 는 False 이 고 그렇지 않 으 면 True 입 니 다.이제 보 니 단 례 를 실현 한 윈 프 롬 에 이론 적 근거 가 생 겼 다.하지만 본사 에 서 는 WinForm 의 구조 함수 에 이런 판단 을 쓸 수 있 습 니 다. 이것 은 하나의 창의 단일 예 일 뿐 입 니 다.우 리 는 지금 응용 프로그램 등급 의 단일 예 를 원한 다.어디서부터 착수 할 까요?
    조급해 하지 마 세 요. Main () 함 수 는 모든 프로그램의 입구 함수 입 니 다.여기 서 판단 을 넣 으 면 됩 니 다.
    
      
      
      
      
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Windows.Forms;  
    5. using System.Runtime.InteropServices;  
    6. using System.Threading;  
    7. using System.Diagnostics;  
    8.  
    9. namespace Young.Winfrom.Singleton  
    10. {  
    11.     static class Program  
    12.     {  
    13.         // hWnd cmdShow  
    14.         [DllImport("user32.dll", EntryPoint = "ShowWindowAsync")]  
    15.         public static extern int ShowWindowAsync(IntPtr hWnd, int cmdShow);  
    16.  
    17.         // hWnd  
    18.         [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]  
    19.         public static extern int SetForegroundWindow(IntPtr hWnd);  
    20.  
    21.         static Mutex me;  
    22.  
    23.         private const int SHOWNORMAL = 1;     //  
    24.         private const int CLOSE = 0;                      //  
    25.         private const int MINISIZE = 2;                  //  
    26.         private const int MAXSIZE = 3;                  //  
    27.  
    28.         /// <summary>  
    29.         ///  。  
    30.         /// </summary>  
    31.         [STAThread]  
    32.         static void Main()  
    33.         {  
    34.             bool isNew = false;  
    35.             me = new Mutex(true"testFrom"out isNew);  
    36.  
    37.             if (!isNew)  
    38.             {  
    39.                 Process pro = GetProcess();  
    40.                 if (pro != null)  
    41.                 {  
    42.                     IntPtr fromHandle = pro.MainWindowHandle;  
    43.                     ShowWindowAsync(fromHandle, SHOWNORMAL);  
    44.                     SetForegroundWindow(fromHandle);  
    45.                 }  
    46.                 return;  
    47.             }  
    48.             else 
    49.             {  
    50.                 Application.EnableVisualStyles();  
    51.                 Application.SetCompatibleTextRenderingDefault(false);  
    52.                 Application.Run(new Form1());  
    53.             }  
    54.  
    55.  
    56.  
    57.         }  
    58.  
    59.         static Process GetProcess()  
    60.         {  
    61.             Process pro = Process.GetCurrentProcess();  
    62.             string current = pro.MainModule.FileName;  
    63.             Process[] pros = Process.GetProcessesByName(pro.ProcessName);  
    64.             int l = pros.Length;  
    65.             foreach (Process p in pros)  
    66.             {  
    67.                 if (p.MainModule.FileName.Equals(current, StringComparison.CurrentCultureIgnoreCase))  
    68.                 {  
    69.                     if (p.Id != pro.Id)  
    70.                         return p;  
    71.                 }  
    72.             }  
    73.             return null;  
    74.         }  
    75.     }  
    76. }  

    위의 예 에서 윈도 API 를 사용 하여 시작 루틴 을 활성화 하고 창 을 맨 위로 이동 합 니 다.
    본문 은 '이 양' 블 로그 에서 나 왔 으 니 전재 를 사절 합 니 다!

    좋은 웹페이지 즐겨찾기