2013-06-24 3 views
3

저는 Windows Forms 응용 프로그램 인 .NET 3.5로 작업하고 있습니다. 특정 기간 후에 활동이없는 경우 현재 양식이 닫히고 사용자가 특정 정보를 표시하지만 다른 양식에 대한 액세스를 허용하지 않는 기본 "로그인하지 않은"양식으로 리턴되는 타이머를 설정했습니다.열려있는 모든 WinForm을 닫으시겠습니까?

Application.OpenForms는 열려있는 대부분의 양식을 닫을 수있는 목록을 제공하지만 Application.OpenForms는 MDI 양식 만 인식합니다. 이러한 MDI 양식 중 일부는 MessageBoxes 또는 다른 모달 폼을 가질 수 있습니다. 모달 양식 자체에 팝업 대화 상자가있는 경우도있을 수 있습니다.

저는 (bug) in Application.OpenForms을 알고 있습니다. Messagebox 또는 다른 유사한 양식을 만든 후에 속성이 변경되는 경우는 없습니다. 어쨌든, 그 양식에만 영향을 주어야하며, 나머지는 여전히 ApplicationOpenForms에 나열되어야합니다.

관심있는 것을 제외한 응용 프로그램의 모든 형식을 반복하고 닫는 우아한 방법이 있습니까? (또는 엄격히 말하자면, MDI 부모를 제외한 모든 노드를 닫고 내가 관심있는 것을 엽니 다.)

+0

'foreach' 루프가 여기서 잘 작동한다고 생각합니다. – Brian

+0

이것은 매우 혼란 스럽습니다. 특히 열려있는'MessageBox' 윈도우 (즉,'MessageBox.Show')가있을 때. 모달 형식은 일반적으로 닫을 수 없기 때문에 일반적으로 문제가 있습니다. 'Cancel' 버튼을 눌러 시뮬레이션해야하고, 올바른 순서로 모달 폼을 처리해야합니다. 이 문제에 상당한 시간을 할애 할 준비를하십시오. –

+0

Windows가 이미 수행하고있는 작업을 이미 구현하려고합니다.그리고 그것은 매우 안전합니다. 일정 시간 동안 사용하지 않으면 자동 워크 스테이션 잠금이 설정되는 것은 매우 간단합니다. 실제로 보안에 관심이있는 대부분의 회사에서 이미이 작업을 수행합니다. 자신의 컴퓨터를 추가하는 것은 어렵지 않을뿐 아니라 Windows가하는 것처럼 안전하지도 않습니다. 특히 암호를 처리하는 코드 부분. –

답변

0

형식의 핸들/참조를 데이터 구조 (예 : 싱글 톤으로 정의 된 배열)로 등록 할 수 있습니까? 곧 그것의 창조로.

이 방법을 사용하면 모든 양식을 만들고 동일한 구조에 관심있는 다른 정보를 저장할 수도 있습니다. 목록이 있으면 두 번째 스레드에서 작업자 프로세스를 실행하여 데이터 구조에 저장된 정보를 기반으로 정리 작업을 수행 할 수 있습니다.

+0

어쨌든, Windows에는 이미 MessageBoxes 등 응용 프로그램이 소유하고있는 모든 양식 목록이 이미 있습니다. 이것은 다시 발명하고 싶지 않은 바퀴입니다. – mickeyf

1

이것은 98 %의 답, 다른 사람의 경우에는 100 %입니다.

거의 모든 경우에 문제를 일으키는 양식은 알림 또는 확인 즉 '기록 저장 됨'또는 '취소 하시겠습니까?' MessageBox를 사용하여 구현되었습니다. 필요한 모든 기능은 MessageBox와 기능적으로 동일한 자체 양식을 작성하고 필요한 MDI 하위에 인스턴스를 작성하여 대신 사용하는 것입니다. MDI 자식 폼이 닫히면 (Application.OpenForms을 반복하여 찾음) 모달 확인 폼도 닫힙니다. MessageBox가 닫히지 않은 이유는 MDI 자식 폼이 실제로 소유하지 않았기 때문입니다. (MSDN : "MessageBox 클래스의 새 인스턴스를 만들 수 없습니다.")

물론 MessageBox의 전체 기능을 복제 할 필요는 없습니다. 대부분의 경우 텍스트 상자와 몇 개의 버튼 만 있으면됩니다.

PrintDialog 및 FileOpenDialog와 같은 기타 기본 제공 Windows 양식에는 MessageBox와 비슷한 문제가 있습니다. 나는 내 자신의 버전을 재현하는 데 어려움을 겪지 않았다. 실수로 우연히 열리지 않으면 커다란 해를 끼치 지 않습니다. 이 문제는 PrintDialog를 가져 와서 실제로 PrintDialog 폼의 Print 단추를 누르는 사이에 누군가가 빠져 나오면 비활성 타이머가 만료되기 전에 다시 나타나지 않는 경우에만 발생합니다.

이러한 유형의 양식에 메시지를 보내면 최악의 경우이를 찾아보고 낮은 수준의 Windows 메시징을 사용하는 것이 좋습니다.

관련 문제