2009-12-17 128 views
2

我有下面的代碼繪製另一個進程的主窗口上的正方形:無法在Internet Explorer上畫

private void DrawOnWindow(string processname) 
{ 
    IntPtr winhandle = GetWindowHandle(processname); 
    Graphics grph = Graphics.FromHwnd(winhandle); 
    grph.DrawRectangle(Pens.Red, 10, 10, 100, 100); 
} 

private IntPtr GetWindowHandle(string windowName) 
{ 
    IntPtr windowHandle = IntPtr.Zero; 
    Process[] processes = Process.GetProcessesByName(windowName); 
    if (processes.Length > 0) 
    { 
     for (int i = 0; i < processes.Length; i++) 
     { 
      if (processes[i].MainWindowHandle.ToInt32() > 0) 
      { 
       windowHandle = processes[i].MainWindowHandle; 
       break; 
      } 
     } 
    } 
    return windowHandle; 
} 

這工作時,我通過「火狐」的DrawOnWindow方法,但它確實當我通過「iexplore」時不工作,我不明白爲什麼。我需要做什麼才能讓它在Internet Explorer上運行? (IE8)

回答

1

IE8有一個頂級進程,它包含主窗口並在其中繪製框架,地址欄和其他控件。 t還有幾個子進程,它們擁有一個或多個選項卡及其相應的窗口。

你的代碼將返回最後一個Iexplore進程的頂級窗口的窗口句柄。但是,如果該過程恰好是子窗口,則存在兩個問題:

  • 它沒有頂層窗口;
  • 沒有保證你認爲,目前可見的標籤屬於這一進程。\

您需要修改代碼和特殊情況下,它的IE瀏覽器,以適應IE進程/窗口層次的細節。

順便說一句,如果你決定借鑑瀏覽器,你將有類似的問題,因爲他們也做多進程和跨越這些過程跨越窗口層次結構類似的技巧。

2

使用IE所繪製的是父窗口,IE8具有WS_CLIPCHILDREN窗口樣式集。你需要做的是下降窗口層次結構,確切地找出你想要渲染哪個孩子,然後去那個窗口上的城鎮。

+0

WS_CLIPCHILDREN不是IE8的問題。 –

+0

如何遍歷IE8窗口層次結構? –

+1

要遍歷層次結構,需要使用EnumChildWindows()GDI函數(或FindWindowEx()等)。您可能首先要使用Spy ++來查看IE8窗口,並將該句柄與您所得到的值進行比較,以確定問題是我正在描述的還是@Franci Penov所描述的。 – Aaron

相關問題