2009-03-18 1 views
7

우리의 응용 프로그램이 Windows Vista (Windows 7 Beta에서도 발생)에서 프로그래밍 방식으로 (MSI 설치 프로그램의 사용자 지정 작업을 통해 또는 새 인스턴스를 시작할 때) 시작되면 작업 표시 줄에 나타나지 않고 초점이 맞춰지지 않습니다. Alt 키를 탭하면 작업 표시 줄에 제대로 표시되고 그대로 유지됩니다.Vista에서 Alt-Tab을 누르기 전까지는 작업 표시 줄에 창이 나타나지 않습니다.

이 원인은 무엇입니까? 이전에 다른 일부 앱에서도이 기능을 보았지만 확실하지는 않습니다. 밖으로 애플 리케이션은. NET WinForms 애플 리케이션입니다. 이 문제가 XP에서는 발생하지 않습니다. Vista와 7 만 해당됩니다.

편집 : 음, 재현성있게 발생하는 유일한 경우는 설치 관리자가 실행할 때와 같지만 다른 시간이 발생한다고 생각합니다. . 시작 코드는 다양한 명령 행 시작 매개 변수를 처리하고 실제로 주 앱 등을 실행하기 전에 로그인 양식을 시작하기 때문에 게시하기가 약간 복잡합니다.

누구나이 시나리오를 처리하고 해내 야 했습니까?

+0

신청서를 어떻게 시작 하시겠습니까? 코드 샘플이 도움이 될 것입니다. 또한로드 프로세스 중에 응용 프로그램이 수행중인 작업을 살펴보십시오. – NotMe

+0

Clickonce가 배포 한 Winforms 응용 프로그램과 동일한 문제가 있습니다. –

답변

0

는 비스타,이 XP에서 일어날 볼 수 없을 7

은 아마 비스타의 버그 ...?

SetForegroundWindow() (또는 이에 상응하는 .NET)를 호출하면 어떻게됩니까?

나는 물론 한 편집

는 "BringWindowToTop()"를 의미한다.

또는 둘 다를 수행하십시오.

+0

Vista의 버그, 최종 사용자는 누구의 잘못인지는 신경 쓰지 않으며, 우리 앱 (그리고 기억이 안나지만)에서 발생하지만 90 % 거기 밖으로 애플 리케이션의, 그래서 사용자의 눈에 그것은 우리의 버그. – Davy8

0

글쎄, 한 가지 해결책은 this과 같은 해킹을 사용하는 것입니다. 그건 그게 진짜가 아니야.

일반적으로 창을 작업 표시 줄에 표시할지 여부는 사용하는 테두리 스타일에 따라 결정됩니다. 내가 링크 된 기사는 좀 더 자세하게 설명합니다. 소유자가 있거나없는 창에 대한 기사의 주석은 설치 프로그램이 시작할 때 창과 다른 소유자가 될 수 있으므로 문제와 관련성이 매우 높습니다.

해당 기사는 VB에 있지만 API 호출을 기반으로하므로 정보가 제공하는 언어는 매우 독립적입니다.

1

일반적인 이유는 주 응용 프로그램 창에 도구 창이나 대화 상자가 아니라 주 응용 프로그램 창임을 알리는 창 스타일이 없기 때문입니다. 따라서 Windows는 앱이 시작된 방법 등을 기준으로 추측해야합니다.

이 문제가없는 다른 창에 대한 창 스타일 인 경우 Spy ++를 사용하여 창 스타일 (특히 확장 스타일)을 작성합니다. WS_EX_APPWINDOW 스타일이 누락 되었습니까? 다른 스타일/확장 스타일이 다른 최상위 창과 다른가요?

0

우리는이 같은 문제를 가지고 양식 속성 showintaskbar 속성을 true로 설정하여 문제를 해결했습니다.

이상한 모든 창문은 같은 방식으로 앱을 실행하지 않습니다!

3

기본 신청서 인 "Form Border"속성을 확인해보십시오. ToolWindow (Fixed 또는 Sizable) 인 경우이를 FixedDialog로 변경해보십시오. 내 경우이 문제가 해결되었습니다.

+0

이유를 아는 사람이 있습니까? – Moelbeck

0

이 상황에서는 Load 이벤트 내에서 양식의 텍스트 속성이 변경된 것으로 기록되었습니다.

이 코드를 BeginInvoke에 넣으면이 이상한 동작이 발생하지 않습니다.

다른 사람들에게 도움이되기를 바랍니다. G.So의 대답은 내 문제에 대한 해결책을 찾을 만든

private void Form_Load(object sender, EventArgs e) 
{ 
    ... 
    ... 
    ... 
    // this needs to be inside a BeginInvoke otherwise it messes with the taskbar visibility 
    this.BeginInvoke(new Action(() => 
     { 
      this.Text = "Something new"; 
     })); 
    ... 
    ... 
    ... 
} 
1

예는, 느릅 나무는 내가 발사에서 내 양식이 상당한 가지고 있다는 사실에 의해 발생하지만, 부하 무효의 테두리로 설정했다.

사람이 ... 내가 경계선에 스위치를 유지하고 여기있다 .. 어떤 더러운 해킹없이 작업 표시 줄에 예상대로 팝업이 관리 방법에 관심이 있다면

은에서 새 이벤트를 확인 폼의 "Shown"이벤트에 양식을 추가하고 여기에 경계선없는 전환을위한 코드 줄을 넣으십시오. 문제가 해결됨 :

다시 한번 감사드립니다.

0

Windows 8에서도 동일한 문제가 발생했습니다. 양식에 포커스가 올바르게 수신되었지만 시간의 30 % 정도만 말하는 경우가 있습니다.

우리는 다른 솔루션을 시도했지만 실제로 일하는 사람은 다음이었다

private void OnFormShown(object sender, EventArgs e) 
{ 
    // Tell Windows that the Form is a main application window 
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 

    // Even if true, enforce the fact that we will the application on the taskbar 
    this.ShowInTaskbar = true; 

    // Put the window to the front and than back 
    this.BringToFront(); 
    this.TopMost = true; 
    this.TopMost = false; 

    // 'Steal' the focus. 
    this.Activate(); 
} 

게다가, 우리는 또한로드 이벤트 기간 동안 양식의 제목을 설정하지 않도록 확인합니다.

1

나는이 이슈로도 얽혀 있었고 이전의 의견 제시 자처럼 FormBorderStyle 속성을 변경하는 Load() 이벤트의 어떤 것도 가질 수 없다고 판결했다. 그것을 Shown() 이벤트로 변경하는 모든 것을 이동하십시오.