2012-11-07 55 views
1

我正在開發一個類似Chrome的應用程序。我有兩個應用程序說父母和孩子的應用程序。子應用程序包含菜單。當我將子應用程序的一個實例附加到父應用程序的選項卡上時。鼠標點擊時不顯示子應用程序中的菜單。兒童進程中的菜單在標籤中沒有顯示鼠標點擊

的代碼片段用於連接過程是

Process P = Process.GetProcessesByName("Child"); 
P.WaitForInputIdle(); 
IntPtr handle = P.MainWindowHandle; 
SetParent(handle, this.tabPage1.Handle); 
MoveWindow(handle, rec.X, rec.Y, rec.Width, rec.Height, true); 

我不能對兒童的應用程序進行任何更改。

回答

0


一些研究之後,我能找出解決辦法。
解決方案

調用的setparent之前,我們應該使用Windows API的SetWindowLongPtr更新窗口風格。 最終代碼將如下

 long style = WinAPI.GetWindowLongPtr(new HandleRef(this,console.MainWindowHandle), WinAPIConstants.GWL_STYLE).ToInt64(); 

     style= style & ~(WinAPIConstants.WS_CAPTION | 
             WinAPIConstants.WS_BORDER | 
             WinAPIConstants.WS_DLGFRAME); 
     IntPtr styleValue = new IntPtr(style); 
     Rectangle displayRectangle = newTab.DisplayRectangle; 

     // Removing the title bar and border. 
     WinAPI.SetWindowLongPtr(new HandleRef(this,console.MainWindowHandle), 
           WinAPIConstants.GWL_STYLE, styleValue); 

     style = WinAPI.GetWindowLongPtr(new HandleRef(this, console.MainWindowHandle), WinAPIConstants.GWL_STYLE).ToInt64(); 
     style &= ~WinAPIConstants.WS_POPUP; 
     style |= WinAPIConstants.WS_CHILD; 

     styleValue = new IntPtr(style); 

     // Setting window to be child of current application and the popup behaviour of window is removed. 
     WinAPI.SetWindowLongPtr(new HandleRef(this, console.MainWindowHandle), WinAPIConstants.GWL_STYLE, styleValue); 

     // Attach the console to the tab. 
     WinAPI.SetParent(console.MainWindowHandle, newTab.Handle); 

謝謝
VIPIN庫馬爾Mallaya。

0

按照MSDN:

「使用WaitForInputIdle()來強制應用程序的處理要等到消息循環返回到空閒狀態當用戶界面的進程執行,其消息循環每次當Windows消息被操作系統發送到進程時執行,進程然後返回到消息循環,當進程在消息循環內部等待消息時,它被稱爲處於空閒狀態,這種狀態是例如,當應用程序需要等待啓動進程在應用程序與該窗口通信之前完成其主窗口的創建時纔有用

如果某個進程沒有消息循環,WaitForInputIdle()會引發InvalidOperationException異常。

WaitForInputIdle()重載指示Process組件無限期地等待進程在消息循環中變爲空閒狀態。該指令可能導致應用程序停止響應。例如,如果進程寫入總是立即退出其消息循環,如代碼片段,而(真)「。

因此,我認爲你應該考慮的評論P.WaitForInputIdle();

+0

我可以將該過程附加到我的選項卡上;我的問題是菜單沒有附加過程。對於附加的子進程(這是一個基於.net的應用程序),菜單不會在鼠標單擊時顯示。 –

+0

準確地說,菜單沒有顯示,因爲孩子已進入空閒狀態。 – rohank

+0

我嘗試不使用WaitForInputIdle,沒有太大的區別。 –

相關問題