2012-03-28 4 views
0

스플래시 화면으로 시작하고 스플래시 화면을 닫고 로그인 양식을 여는 C# WinForms 앱 관련 버그를 처리하고 있습니다. 일부 컴퓨터에서는 모든 것이 잘 작동합니다. 다른 사용자의 경우 로그인 양식이 나타나지만 깜박이는 제목 표시 줄이 깜박입니다.이 제목 표시 줄은 초점을 잃습니다. 커서는 여전히 "사용자 이름"텍스트 상자에서 깜박이지만 앱에는 포커스가 없으며 입력을 시작하면 아무 일도 일어나지 않아 사용자에게는 매우 성가 시게됩니다.모달 대화 상자가 포커스를 얻지 못합니다.

실행중인 OS (Windows 7 및 Server 2008을 사용해 보았습니다.)와 차이가없는 것 같으며 응용 프로그램을 시작한 후에 키보드 또는 마우스 입력을하지 않는 것이 좋습니다.

이제 누가 앱이 포커스를 잃을 수 있는지 알 수 있습니까?
또는이 문제를 어떻게 디버그하겠습니까? 우리는 Visual Studio 디버그 환경에서 문제를 재현 할 수 없었지만 컴파일 된 응용 프로그램이 OS와 상호 작용하는 방식에 문제가 있다고 생각하기 때문에 완전히 놀라지 않습니다 ... 아니면 틀린가요?

수정 # 1 : 나는이 로그인 폼이 표시되기 전에 시작 화면이 제대로 닫혀 있는지 확인함으로써, @vinodpthmn에 의해 해결되었다 생각했지만,이 도움이되지 나타납니다. 활성 형태와 응용 프로그램을 각각 표시 Form.ActiveForm와 현재 활성화 된 윈도우의 응용 프로그램 (코드를 보여주는

Thread 01 - 2012/03/29 12:51:09.693 - Show splash screen 
Thread 01 - 2012/03/29 12:51:20.350 - Splash screen closed 
Thread 01 - 2012/03/29 12:51:20.490 - Login Form Activated 
Thread 01 - 2012/03/29 12:51:20.522 - Login Form Load 
Thread 01 - 2012/03/29 12:51:25.694 - Login Form deactivated 
Thread 01 - 2012/03/29 12:51:25.694 - Active form = 
Thread 01 - 2012/03/29 12:51:25.694 - Active app = 

그 마지막 줄 : 그래서 나는 다음과 같은 흥미로운 로그 항목을 모든 이벤트와 스레드를 추적 할 수있는 로거를 생성하고, 발견 이 here). 둘 다 비어 있거나 null입니다. 로그인 폼에 Load @ I가 Activate() 또는 SetForegroundWindow()이라면 @memetolsen이 제안한 것처럼 그렇게 할 수 있습니다. 로그인 양식은 포커스를받지 못합니다!

아이디어가 있으십니까?

편집 # 2 : 글쎄, 방금 스플래시 화면을 제거하고 이제 로그인 양식에 초점을 맞 춥니 다. 스플래시 화면을 바꾸면 버그가 다시 나타납니다. 하지만 로그인 폼을 열려고 시도하기 전에 스플래시 화면이 이되도록을 처리하도록 코드를 입력했습니다.

스플래시 화면이 Application.Run(frmSplash)으로 열리는 차이점이 있습니까?

+1

사실 뒤에 디버거를 연결하십시오. –

+0

스플래시 화면이 삭제되었거나 여전히 기본 UI 메시지 스레드와 간섭 할 수 있습니다. – Lloyd

+0

다른 창이 활성화 될 때 모달 창에서 깜박이는 제목을 가져옵니다. – Polyfun

답변

5

IT는 시작 화면 Application.Run (frmSplash)으로 개방되는 차이

,369 만들 수

물론이 방법을 사용하면 이런 종류의 문제가 발생할 수 있습니다. 이 문제는 초를 위해 창이 포커스를받을 수 있기 때문에 발생합니다. 스플래시 화면이 사라 졌으므로 메인 창에 몇 밀리 초가 있어야 생성되고 표시됩니다. 이렇게하면 Windows가 포커스를 제공 할 다른 창을 찾습니다. 그것은 당신의 창이 될 수 없으므로 다른 응용 프로그램의 창을 고를 것입니다. 메인 윈도우에는 포커스가 표시되지 않습니다.

창 관리자가 사용하는 정확한 규칙이 분명하지 않아서이 초점 손실이 항상 발생하는 것은 아닙니다. 시간과 관련된 것 같아요.

이미 프레임 워크에 내장 된 스플래시 화면을 훌륭하게 문제없이 지원하여 문제를 해결하십시오. this answer에 코드를 사용할 수 있습니다. 사용하지 않으려면 코드를 다시 작성하여 시작 화면을 닫기 전에 주 창이 표시되는지 확인하십시오.

+0

고마워요! 스플래시 화면의'Closing' 이벤트에 지연을 추가했는데 이제 로그인 폼에 포커스가 있습니다! –

1

remote debugging을 설정하는 것이 좋습니다. 이렇게하면 개발 컴퓨터에서 원격으로 응용 프로그램을 디버깅 할 수 있습니다.

this.Activate(); 

나이 :

SetForegroundWindow(this.Handle.ToInt32()); 

을 폼의 Load 이벤트에이를 넣어 경우

+0

+1 원격 디버깅 링크 –

1

은 아마 해결책이 될 것입니다.

그래도 해결되지 않으면 일정 시간 후이 코드를 강요하는 타이머를 사용해보십시오.

2

이전에 비슷한 문제가 발생했습니다. 문제는 스플래시 화면이 부적절하게 닫혀서 발생했습니다. 포커스가 그 형식일지도 모른다고 생각합니다.

  1. 는 다음 사용자 상호 작용
  2. 때까지 기다려야
  3. 로그인 폼이 실행 포인터를 지시하는 모달로 표시됩니다 제대로
  4. 로그인 화면이 시작 화면의 적절한 언로드 후 표시됩니다/닫기 시작 화면 양식을 언로드 확인
관련 문제