2012-05-20 4 views
3

내 WPF 애플리케이션에 둘 이상의 창이 있으며,이 창 중 일부를 다른 프로세스의 창에 첨부하고 싶습니다. 내 문제는 일단 내 창을 첨부하면 보이지 않게된다는 것입니다. 다른 프로세스의 창에 창 첨부하기

public static bool setParentWindow(IntPtr hWndChild, IntPtr hWndNewParent) 
    { 
    IntPtr previousParent = SetParent(hWndChild, hWndNewParent); 
    return (previousParent == null ? false : true); 
} 

[DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 

setParentWindow(myWindowHwnd, newParentHwnd); 

그래서, 위의 코드가 성공적으로 윈도우를 부착,하지만 불행히도 그것은 보이지 않게 :

나는 다음 코드를 사용하여이 작업을 시도하고있다.

내 이유는 이것에 대한 "위젯"을 구축하여 응용 프로그램을 확장하려고하는데 내 위젯이 사용자 정보를 보여주고 사용자에게 보여줄 것입니다.

두 창의 스타일은 모두 WS_OVERLAPPEDWINDOW, WS_OVERLAPPED, WS_VISIBLE, WS_CLIPSIBLINGS, WS_CLIPCHILDREN입니다.

+0

창을 연결한다는 것은 무엇을 의미합니까? 어떤 창 스타일이 관련되어 있습니까? – Neil

+0

@ Neeil : 내 질문의 끝 부분에 스타일을 추가했습니다. 첨부하면 내 WPF 창을 새 창의 자식으로 만들려고합니다. – Drahcir

+0

창을 다른 프로세스로 다시 양육하는 것은 매우 어렵습니다. 다른 솔루션을 권하고 싶습니다. –

답변

6

setParent 호출을 사용하지 않고도이 작업을 수행 할 수 있음을 알았습니다.

MyWindow window = new MyWindow(); 
window.ShowActivated = true; 

HwndSourceParameters parameters = new HwndSourceParameters(); 

parameters.WindowStyle = 0x10000000 | 0x40000000; 
parameters.SetPosition(0, 0); 
parameters.SetSize((int)window.Width, (int)window.Height); 
parameters.ParentWindow = newParent; 
parameters.UsesPerPixelOpacity = true; 
HwndSource src = new HwndSource(parameters); 

src.CompositionTarget.BackgroundColor = Colors.Transparent; 
src.RootVisual = (Visual)window.Content; 

이 아무 문제없이 지금 큰 노력하고 다음과 같이 나는하여 HwndSource 클래스를 사용했다.

+0

@DavidHeffernan : 해결 방법을 찾았습니다. :) – Drahcir

+0

위의 코드가 어떻게 되나요? 내 문제는 src.RootVisual 줄입니다. http://stackoverflow.com/questions/10773003/attach-form-window-to-another-window-in-c-sharp –

+1

@HorstWalter : 질문을 살펴 보았습니다. 대답은 좋은 것 같습니다. 이 방법은 도움이되지 않으므로 WPF 창에만 HwndSource를 사용할 수 있습니다. – Drahcir

1

난 당신이 중첩 된 창문이 무엇을해야하는지 잘 모르겠지만, MSDN에서 :

호환성을 위해

, SetParentWS_CHILD을 수정하지 않는 부모 윈도우의 또는 WS_POPUP 윈도우 스타일 변경되고있다. hWndNewParentNULL 경우 따라서, 당신은 또한 WS_CHILD 비트를 지우고 setParent가 불려 갔을를 호출 한 후 WS_POPUP 스타일을 설정해야합니다. hWndNewParentNULL하지 않고 윈도우가 이전에 바탕 화면의 아이 일 경우 반대로, 당신은 WS_POPUP 스타일을 지우고 setParent가 불려 갔을를 호출하기 전에 WS_CHILD 스타일을 설정해야합니다.

+0

닐 감사합니다,하지만 여전히 작동하지 않습니다. – Drahcir

0
private void TryToAttach(IntPtr ownerHandle) 
{ 
    if(ownerHandle == IntPtr.Zero) 
    { 
     return; 
    } 
    try 
    { 
     var helper = new WindowInteropHelper(window) { Owner = ownerHandle }; 
    } 
    catch(Exception e) 
    { 
     Logger.Error(e, "Could not attach window."); 
    } 
} 
+0

이 질문에 대한 답변을 드릴 수도 있지만, 또는 이유. 답을 설명하기 위해 한 두 문장을 더하는 것을 고려하십시오. –

+0

[WindowInteropHelper] (https://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper (v = vs.110) .aspx)는 System.Windows.Interop 네임 스페이스의 클래스입니다. Windows Presentation Foundation (WPF)과 Win32 코드 간의 상호 운용을 지원합니다. – ggJa

+0

답변을 향상 시키려고 노력한 것을 기쁘게 생각합니다. 답안에 주석과 같은 설명을 추가해야합니다. 댓글을 정리할 수 있으며 모든 사용자가 댓글을 읽지 않아 사용자의 설명을 놓칠 수 있습니다. –

관련 문제