문제

우리는 C ++ 레거시 애플리케이션을 보유하고 있으며 부모 C ++ 앱에서 COM을 사용하여 호출되는 C# 애플릿으로 확장하고 있습니다. 그들은 모달이 아닌 창을 가져옵니다. 또한,이 .NET Windows는 C ++ 애플리케이션의 적절한 어린이가 아니라고 생각합니다. EnumchildWindows가 놓치고 Enumwindows가 찾을 수 있기 때문입니다. 그러나 부모 C ++ 앱을 닫으면 C# 창도 닫히게됩니다.

이 모든 것의 기본 문제는 사용자 가이 C# 애플릿 중 하나를 호출하면 부주의하게 부모 (C ++) 앱 창을 클릭하면 C# 창이 배경으로 떨어집니다. 사용자가 이것을 상단으로 다시 가져 오려면 작업 표시 줄에서 아이콘을 클릭 할 수 있어야합니다. 불행히도 이상한 이유로 작업 표시 줄 아이콘을 클릭해야합니다. 세 번! 처음에는 숨겨진 창을 맨 위로 가져와야하지만 그렇지 않습니다. 두 번째 클릭은 숨겨진 창을 최소화하고 세 번째는 성공적으로 복원합니다.

레거시를 연결할 때 다른 사람 이이 버그/기능을 실행합니까->. Net Divide? C# 애플릿의 작업 표시 줄 아이콘을 첫 번째 클릭 할 수 있는지 궁금합니다. 어떻게 든 상단으로 돌아가도록 강요합니다. :-)

나는 다음을 실험하고있다 :

  [DllImport("User32.dll")]
  private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);

그러나 내가이 일을하게 되더라도 나는 여전히 그 첫 번째 mouseclick을 가로 채어야합니다. 당신의 도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

C# Windows가 실제로 자식 창인 경우 작동할까요? 부모 HWND를 C# com 객체에 대한 인수로 전달한 다음 Pinvoke를 사용하여 세트 분당 C# Windows에서. (나는 이것을 한 적이 없지만 적어도 Showwindow와 Task Bar와의 싸움만큼 안전하게 들리나요?)

(하위 창문의 창문 플래그와 함께 바이올린이 필요할 수 있다는 SetParent의 Documetation의 주석에서 주석을 두십시오.)

(C# 창 유형에 따라 이미 사용할 수있는 핸들 속성이있을 수 있습니다. 그렇지 않으면 핀 보크 호출을 FindWindow로 핸들을 얻을 수 있습니다.)

다른 팁

 // Here's the code... 
 [DllImport("User32.dll")]
  static extern int GetForegroundWindow();
  [DllImport("User32.dll")]
  private static extern int SetParent(int hwndChild, int hwndParent);


  public void ShowMyFormAsChildOf ( int hwndParent )
  {
    MyForm form = new MyForm();
    form.Show(); // immediately after .Show(), it is the foreground window!
    SetWindowParent( hwndParent );
  }

  private void SetWindowParent(int parenthwnd)
  {
     if (0 != parenthwnd)
     {
        int handle = GetForegroundWindow();
        SetParent(handle, parenthwnd);
     }
  }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top