2009-12-17 5 views
2

je le code suivant qui dessine un carré dans la fenêtre principale d'un autre processus:peut pas tirer sur 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; 
} 

Cela fonctionne quand je passe « firefox » à la méthode DrawOnWindow, mais il ne ne fonctionne pas quand je passe "iexplore" et je ne comprends pas pourquoi. Que dois-je faire pour que cela fonctionne sur Internet Explorer? (IE8)

Répondre

1

IE8 possède un processus de niveau supérieur qui contient la fenêtre principale et dessine le cadre, la barre d'adresse et d'autres contrôles. t a également plusieurs processus enfants, qui possèdent un ou plusieurs onglets et leurs fenêtres correspondantes.

Votre code renverra le handle de fenêtre pour la fenêtre de niveau supérieur du dernier processus Iexplore. Toutefois, si ce processus s'avère être une fenêtre enfant, il y a deux problèmes:

  • il ne possède pas de fenêtre de niveau supérieur;
  • rien ne vous garantit que l'onglet visible actuel appartient à ce processus. \

Vous devez modifier votre code et cas particulier pour IE pour tenir compte des spécificités du processus IE/hiérarchie des fenêtres. Btw, si vous décidez de dessiner sur Chrome, vous aurez des problèmes similaires, car ils font également des trucs similaires avec plusieurs processus et hiérarchie de fenêtres qui s'étendent à travers ces processus.

2

Avec IE ce que vous dessinez est la fenêtre parente et IE8 a le jeu de style de fenêtre WS_CLIPCHILDREN. Ce que vous devez faire est de descendre la hiérarchie de la fenêtre et déterminer exactement quel enfant vous voulez rendre et ensuite aller en ville sur cette fenêtre à la place.

+0

WS_CLIPCHILDREN n'est pas le problème avec IE8. –

+0

Comment puis-je parcourir la hiérarchie de fenêtres IE8? –

+1

Pour parcourir la hiérarchie, vous devez utiliser la fonction GDI EnumChildWindows() (ou FindWindowEx(), etc.). Vous pouvez d'abord utiliser Spy ++ pour regarder la fenêtre IE8 et comparer le handle à la valeur que vous obtenez pour déterminer si le problème est ce que je décris ou ce que décrit @Franci Penov. – Aaron

Questions connexes