2012-05-20 142 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:我看看你的問題和答案似乎很好。你只能使用WPF窗口的HwndSource,所以這沒有幫助。 – Drahcir

1

我不知道你需要有重疊的窗口做什麼,但是從MSDN:

出於兼容性考慮,SetParent不修改WS_CHILDWS_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 namesapce中的類。協助Windows Presentation Foundation(WPF)和Win32代碼之間的互操作。 – ggJa

+0

我很高興看到你在努力改善你的答案,作爲一項規則,你應該在答案中加入澄清,而不是在評論中進行編輯。意見可以得到清理,而不是每個人都閱讀,因此您的澄清可能會被錯過。 –

相關問題