2012-05-20 2 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

@Neil: Я добавил стили в конец моего вопроса, добавив, что я хочу, чтобы мое окно WPF было дочерним по отношению к новому окну. – Drahcir

+0

Воспроизведение окон в другие процессы чрезвычайно сложно. Я бы порекомендовал другое решение. –

ответ

6

Я обнаружил, что могу сделать это, даже не используя вызов setParent. Я использовал класс HwndSource следующим образом:

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; 

Это прекрасно работает без проблем.

+0

@DavidHeffernan: Я нашел способ исправить это :) – Drahcir

+0

Любая идея, как бы выглядел вышеприведенный код, если у меня есть форма выигрыша? Моя проблема заключается в строке src.RootVisual: http://stackoverflow.com/questions/10773003/attach-form-window-to-another-window-in-c-sharp –

+1

@HorstWalter: Я просмотрел ваш вопрос и ответ кажется хорошим. Вы можете использовать только HwndSource для окон WPF, поэтому это не поможет. – Drahcir

1

Я не уверен, что вам нужно сделать, с перекрывающимися окнами, но из MSDN:

соображений совместимости SetParent не изменяет WS_CHILD или WS_POPUP стили окна из окна которого родитель меняется. Поэтому, если hWndNewParent является NULL, вы также должны очистить WS_CHILD бит и установите WS_POPUP стиль после вызова SetParent. И наоборот, если hWndNewParent не NULL и окно было ранее ребенком на рабочем столе, вы должны очистить WS_POPUP стиля и установить WS_CHILD стиля перед вызовом SetParent.

+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 namesapce. Помогает взаимодействовать между Windows Presentation Foundation (WPF) и кодом Win32. – ggJa

+0

Я рад видеть, что вы пытаетесь улучшить свой ответ, как правило, вы должны добавлять разъяснения, подобные этому в своем ответе, путем редактирования, а не в комментариях. Комментарии могут быть очищены, и не все читают их, поэтому ваше разъяснение может быть упущено. –

Смежные вопросы