c# - HwndHost를 사용하여 WPF 내부의 외부 창을 호스팅하는 올바른 방법

기사 출처 c# wpf hwndhost

WPF 응용 프로그램 내에서 외부 프로세스 창을 호스팅하고 싶습니다. 나는 HwndHost를 다음과 같이 파생시키고있다 :

    class HwndHostEx : HwndHost
    {
        [DllImport("user32.dll")]
        static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        private IntPtr ChildHandle = IntPtr.Zero;

        public HwndHostEx(IntPtr handle)
        {
            this.ChildHandle = handle;
        }

        protected override System.Runtime.InteropServices.HandleRef BuildWindowCore(System.Runtime.InteropServices.HandleRef hwndParent)
        {
            HandleRef href = new HandleRef();

            if (ChildHandle != IntPtr.Zero)
            {
                SetParent(this.ChildHandle, hwndParent.Handle);
                href = new HandleRef(this, this.ChildHandle);
            }

            return href;
        }

        protected override void DestroyWindowCore(System.Runtime.InteropServices.HandleRef hwnd)
        {

        }
    }


그리고 이것을 다음과 같이 사용하십시오 :

 HwndHostEx host = new HwndHostEx(handle);
 this.PART_Host.Child = host;


여기서 handle는 호스팅하려는 외부 창에 대한 핸들이고 PART_Host는 내 WPF 창 내의 테두리입니다.

<StackPanel UseLayoutRounding="True"
        SnapsToDevicePixels="True"
        Background="Transparent">
        <Border Name="PART_Host" />
...


이것은 나에게 예외를 준다 :

Hosted HWND must be a child window.


내 지식이 부족하여 죄송하지만 WPF 응용 프로그램 내에서 외부 창을 호스팅하는 올바른 방법은 무엇입니까?
'SetParent'를 호출하기 직전에 다음을 수행하십시오.

public const int GWL_STYLE = (-16);
public const int WS_CHILD = 0x40000000;

SetWindowLong(this.ChildHandle, GWL_STYLE, WS_CHILD);

이 질문에 대해 Stack Overflow에서 비슷한 토론을 찾았습니다: https://stackoverflow.com/questions/30186930/

관련 기사
c# - 공통 출력 디렉토리, 웹 애플리케이션 및 IIS Express
c# - 형식은 일반 형식 또는 메서드 'BaseController <T>'에서 형식 매개 변수 'T'로 사용할 수 없습니다. 암시 적 참조가 없습니다
c# - 스레드 간 뮤텍스?
c# - 대리인 할당이 C#에서 새 복사본을 생성합니까?
c# - ExpectedException 속성이 예상 결과 C#을 표시하지 못함
c# - REST API를 통해 새 Azure Application Insights 인스턴스를 만드는 방법
c# - Stackoverflow 예외 종료 양식
c# - SQL 연결 문자열 제공자 이름
c# - Node.JS 비 차단 IO 및 async / await를 통한 ASP.NET MVC 비 차단 IO와 같은 다른 프레임 워크 [닫기]
c# - EntityFramework .Take () 시간이 지남에 따른 성능 손실