2010-07-08 2 views
1

관리 양식 ('adminForm')과 다른 양식 ('userForm')이 포함 된 winforms 응용 프로그램이 있습니다. 설정된 시간 간격으로 실행합니다.Form1이 'MainWindowTitle'을 사용하지 않고 열려있는 동안 Form2가 열리지 않도록하십시오.

adminForm이 열려있을 때 userForm이 열리지 않게하려면 어떻게합니까?

는 최근까지 userFrom 같은 코드의 'MainWindowTitle'값을 이용하여 개구 방지 하였다

"XXXXX"는 adminForm.Text 값인
  // Retrieving all running processes for checking admin interface running or not 
      Process[] objArrPrs = Process.GetProcesses(); 

      foreach (Process objProces in objArrPrs) 
      { 
       string strMainWindowTitle = string.Empty; 
       strMainWindowTitle = objProces.MainWindowTitle.ToString(); 

       if (strMainWindowTitle != string.Empty || strMainWindowTitle != "") 
       { 
        // Retrievig process name 
        string strProcess = objProces.ProcessName; 
        if ((strMainWindowTitle == "XXXXX" && strProcess == "XXXXX") 
         || ((strMainWindowTitle == "XXXXX" && strProcess == "XXXXX.vshost"))) 
        { 
         blnAdminScrOpen = true; 
         break; 
        } 
       } 
      } 

(예를 들어, 'this.Text = " XXXXX "). 이 방법은 잘 작동했습니다.

그러나 두 양식이 모두 다시 디자인되었으며 양식 제목 막대가 없으므로 이제 양식의 '텍스트 값이 null이고 위에 표시된 코드가 더 이상 작동하지 않습니다.

adminForm이 열려있을 때 userFrom이 열리지 않도록하는 데 사용할 수있는 새로운 C# 전략에 대한 제안 사항이 있습니까? 샘플 코드의 방향으로 나를 지적 할 수 있다면 고맙겠습니다.

건배, 프레드릭 enter code here

답변

1

경우] 다음과 같이

싱글 톤 패턴의 요점은 양식은 동일한 응용 프로그램에서 모두 OpenForms 대신 열려있는 모든 양식을 반복하고 내가 볼 수 있도록 확인하십시오. 그것은 열려 있습니다.

검사의 아주 좋은 방법을 모든 프로세스를하지 않습니다 확인하고 쉽게 팀이 한 말에 대한 대안으로 예를

+0

답변 해 주셔서 감사합니다. 나는 다음과 같은 코드에서 OpenForm을 사용했다 : FormCollection fc = Application.OpenForms; (fc [i] .Name == "formAdmin") { blnAdminScrOpen = true; 휴식; } } 이며 adminForm이 열려 있는지 확인할 수있었습니다. 또한 adminForm에 Tag 값을 부여한 후 fc [i] .Tag를 사용하여이 작업을 수행 할 수 있습니다. – Frederick

+0

제가 도와 드릴 수있어서 다행입니다. 부탁을 회신 하시려면 대답으로 표시하거나 투표를하십시오. 감사합니다 – w69rdy

+0

제 질문은, cleaver 사용자가 내 adminForm이 adminForm이 열려있을 때 열려 있다고 생각하도록 속일 경우 adminForm과 동일한 이름 (또는 Tag 값)을 가진 양식으로 자신의 응용 프로그램을 만든 다음 설치할 수 있습니까? 컴퓨터에서 해당 양식을여십시오. 즉, 이렇게하면 내 응용 프로그램의 OpenForms 코드가 사용자 정의 폼을 열지 못하게 할 수 있습니까? – Frederick

0

당신은 양식에 싱글 톤 패턴을 구현할 수는 다음 adminForm의 멤버 변수를 얻을하고 Visible 속성을 확인. 싱글 톤 패턴에 익숙하지 않은 경우 코드를 제공 할 수 있습니다. 기본적으로 클래스가 변경되므로 단일 인스턴스 만있을 수 있습니다. 기존 코드를 약간 수정해야하지만 궁극적으로 더 깨끗한 솔루션이 될 것입니다. 이 작업을 수행하는 데 사용

public class MyForm : Form 
{ 
    //this is used to keep a reference of the single 
    //instance of this class 
    private static MyForm _instance; 

    //your constructor is private, this is important. 
    //the only thing that can access the constructor is 
    //the class itself. 
    private MyForm() 
    { 
     //do stuff 
    } 

    public static MyForm GetInstance() 
    { 
     //the check to IsDisposed is important 
     //if the form is closed, the _instance variable 
     //won't be null, but if you return the closed 
     //form (ie, disposed form) any calls to the form 
     //class (ie, Show()) will throw in exception. 
     if (_instance == null || _instance.IsDisposed) 
     { 
      _instance = new MyForm(); 
     } 
     return _instance; 
    } 

    //other code 
} 

는 :

MyForm f = new MyForm(); 

이제 이런 짓을 했을까 :

MyForm f = new MyForm.GetInstance(); 
+0

안녕하세요. Tim, 응답 해 주셔서 감사합니다.나는 싱글 톤 패턴에 익숙하지 않다. 난 그냥 그것에 대한 Wikipedia 항목과 그것에 대한 또 다른 Stackoverflow 항목을 읽었지만, 나를 위해 그것을 명확하게하지 않았다. 코드 샘플을 제공하기 전에 단일 패턴이 클래스를 변경하여 단일 인스턴스 만 허용한다고 말할 때 어떤 파급 효과가 발생하는지 질문하게하십시오. adminForm의 링크에서 userForm을 열 수도 있기 때문에이 질문을 던지므로 adminForm과 userForm을 동시에 열어야합니다. 그게 단일 인스턴스 조건을 위반합니까? – Frederick

+0

아니요, 단일 인스턴스 조건을 위반하지 않습니다. 이 의미는 패턴을 구현하는 각 양식 중 하나만있을 수 있다는 것입니다. 패턴을 구현하는 15 가지 양식이있는 경우 응용 프로그램에서 15 개의 양식을 열 수 있습니다. –

0

를 들어, 프로세스 이름 변경하는 경우 깨질 수, 당신은 또한 참조 정적 클래스를 구현할 수 있습니다 AdminForm의 기본 인스턴스로 이동하십시오. 예를 들어 :

public AdminForm() { 
    // -snip- 
    Global.AdminFormInstance = this; 
} 

그리고 당신이 볼 수 있는지 확인해야하는 경우 다음 바로 Visible 재산 확인 :

당신의 AdminForm의 생성자에서

public static class Global { 
    public static AdminForm AdminFormInstance { get; set; } 
} 

,이 라인을 추가 할 수 있습니다

if (Global.AdminFormInstance.Visible == false) 
    DoSomethingWhenItsNotVisible(); 

정적 멤버는 다중 스레드를 수행하고있는 것으로 보이지 않지만 스레드로부터 안전하지는 않습니다.

관련 문제