2009-07-17 2 views
2

Windows Forms, .net 2.0다른 양식과 동일한 z- 순서로 새 양식 만들기

주 응용 프로그램 스레드의 양식 (A)은 다음과 같습니다. (BeginInvoke를 사용하여) 숨기려면 주 응용 프로그램 폼을 일으키는 및 자신의 스레드 (별도의 (B) 새 폼을 만듭니다. 메시지 펌프).

두 개의 스레드가 복잡하게 들릴 수도 있지만 불행하게도 필요합니다.

새 메시지 펌프의 새 양식은 최상위가 아닌 양식 맨 위에 표시됩니다 (예상 한대로!). 그러나 원래 응용 프로그램이 바탕 화면 위에 있지 않은 경우 이는 매우 성가시다.

원본 양식 (A)의 z- 순서가 숨기기 전에 무엇인지 결정하고 싶습니다. 원래 양식의 Z- 순서를 미러링하여 새 양식 (B)을 작성하십시오.

아이디어가 있으십니까?

[이것은 또한 현재 사용자의 바탕 화면 (예 : 암호가 설정되지 않은 화면)에있는 경우 화면 보호기를 통해 나타나는 B 형의 부작용을 가지고 있습니다. 이 문제를 피하고 싶습니다 ...]

+0

두 번째 형식은 자체 스레드입니다. 나는 개발자가 왜 누군가가 그들에게 왜 그런지 설명 할 수 없을 때까지 자신의 폼을 "멀티 스레드"해야한다고 확신하는 무수한 시간을 보았다. 나는 그럴 수 없다는 말은 아니지만, 종종 사용자가 잘못된 접근법을 가지고있다. –

+0

주 스레드는 여러 가지 양식, 하위 양식 등이 포함 된 복잡한 LOB 응용 프로그램입니다. 두 번째 스레드는 나중에 복원 할 수있는 현재 대화 상자를 포함하여 모든 양식을 숨김으로써 주 응용 프로그램을 "잠급니다"보안 절차입니다. 이러한 형태 중 일부는 제 3 자 라이브러리에 의해 만들어지며 당사가 통제 할 수 없습니다. 보안 요구 사항이 디자인 첫날부터 있었다면 두 번째 응용 프로그램 펌프가 필요하지 않을 수도 있지만 잠금이 타사 양식 등을 처리 할 수있는 "일반"이라는 것을 의미합니다. –

+0

대화 상자 가져 오기를 시도 했습니까? .ShowDialog (Me) 또는 .ShowDialog (this)를 사용하여 전달하십시오. 부모에 대한 참조와 함께 ShowDialog를 사용하면 모든 입력에서 부모 폼이 잠기고 포커스가 허용되지 않습니다. –

답변

1

이 문제는 Win32 GetWindow 함수를 사용하여 이전 주 창에 어떤 것이 있는지 확인하여 해결했습니다. 다음 두 번째 스레드에서 새 폼을 만들 때 SetWindowPos를 사용하여 z- 순서를 첫 번째 단계에서 얻은 값으로 설정할 수 있습니다.

은 또한 응용 프로그램이 초점을 맞춘 응용 프로그램이 있다면 결정하기 위해 nobugz 제안을 사용하고, 나는 ShowWithoutActivation 재정의를 사용하지 않을 경우 내 새로운 형태가 활성화 시작하지 않도록 내가 가진 뒤에 이유를 듣고 궁금

+0

nobugz 응답이 삭제되어서이 대답이 그다지 도움이되지 않는 것 같다 :-( –

0

AFAIK, 당신은 그것을 앞에 가져 오려면 Form.Activate()를 호출 할 수 있지만 WinForms에서는 Windows 레벨의 z 순서를 모른다. Win32에서 더 나은 행운을 누릴 수 있습니다.

+0

네, 앞으로 가져오고 싶지 않습니다 - 그것이 요점입니다. 나는 오히려 내가 Win32에서 p/invoke 할 필요가 있다고 가정했으나 나는 무엇을 알지 못한다. ... –

관련 문제