2011-11-11 2 views
1

내 응용 프로그램에 기본 폼이 없습니다. 초기화는 Program.Main()에서 수행되고 Application.Run()이 호출됩니다.대화 상자를 표시하고 닫은 후 Win32 GetForegroundWindow()가 해당 윈도우를 계속 반환합니다.

  1. 내 양식을 인스턴스화 : 사용자가 다른 응용 프로그램에있는 경우

    그들은 내 응용 프로그램에서 다음 트리거 키보드 단축키를 누르십시오.

  2. 양식을 표시하십시오.
  3. Win32 API GetForegroundWindow()를 호출하여 활성화 된 창을 찾습니다.
  4. 몇 가지 작업을 수행하십시오.

  • 호출을 알리고 Form.Close()
  • 설정 양식은 = 나는 몇 번 위를 실행할 수있는 모든 잘됩니다. 그러나 내 응용 프로그램이 MessageBox()를 호출 할 때마다 현재 포커스가 다른 응용 프로그램에있는 경우에도 GetForegroundWindow()에 대한 모든 후속 호출이 닫힌 양식을 반환합니다. 이는 CredUIPromptForCredentials()가 사용자에게 로그인 및 암호를 입력하는 경우에도 발생합니다. ProcessInfo.GetActiveProcess() 호출은 포커스가있는 다른 응용 프로그램 대신 내 프로세스를 반환합니다.

    내가 뭘 잘못하고 있을지 모르겠다. 내 앱에서 포커스를 제거하기 위해 호출 할 수있는 무언가가있을 것입니다. SetForeGroundWindow의 종류의 종류?

    EDIT 1

    그것은 사실이 아닌 모달 폼이 아닌 대화입니다. 양식을 표시하려면 Show()를 인수없이 사용하고 있습니다. Close() 후에 Dispose()를 호출했지만 동작은 동일합니다. 내 양식에 Show()를 호출하지 않으면 앱이 올바르게 작동하는 것으로 확인되었습니다. 이 양식에는 제목을 변경하는 경우를 제외하고 VS2010에서 양식을 만들 때 얻을 수있는 모든 기본값이 있습니다. 양식에는 하나의 레이블 만 있습니다. Form.Close에서 문서 당

  • +0

    발생하는 윈도우의 맛은 무엇입니까? – user957902

    +0

    Windows 7 64 비트 –

    답변

    0

    : 폼이 근접 배치되어 있지 않은 경우 (1)는 복수의 문서 인터페이스 (MDI) 어플리케이션의 일부이고 때

    두 조건

    양식이된다 눈에 보이지 않는다; (2) ShowDialog를 사용하여 양식을 표시했습니다. 이 경우 가비지 수집을 위해 양식의 모든 컨트롤을 표시하려면 Dispose를 수동으로 호출해야합니다.

    제목에 언급 된 내용이므로 대화 형식이라고 가정합니다. 명시 적으로 Dispose를 호출하여 win32 리소스를 할당 해제해야 할 필요가있는 것 같습니다.

    +0

    답변 해 주셔서 감사합니다. 귀하의 제안을 시도의 결과는 내 질문에 있습니다. –

    +0

    모달 대화 상자가 아니기 때문에 분명히 적용되지 않습니다. – user957902

    관련 문제