2010-01-06 7 views
2

Dans mon application, je suis en train de lire le texte d'une fenêtre pour le même processus. J'utilise GetWindowText de User32.dll. Mais quand il essaie d'appeler la méthode, j'obtiens l'exception "Une exception non gérée de type 'System.ExecutionEngineException' s'est produite dans aaaa.exe". Où puis-je voir l'erreur exacte? Et pourquoi je reçois cette exception.Une exception non gérée du type 'System.ExecutionEngineException' se produit lors de la tentative de lecture de la fenêtre à partir de GetWindowText() de user32.dll

Mon code est le suivant.

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
public static extern int GetWindowText(IntPtr hWnd, 
    [Out] StringBuilder lpString, int nMaxCount); 

EnumDelegate enumfunc = new EnumDelegate(EnumWindowsProc); 

private bool EnumWindowsProc(IntPtr win, int lParam) 
{ 
    StringBuilder sb = new StringBuilder(); 
    GetWindowText(win, sb, 100); 
    if (sb.Length > 0) 
    { 
     // do something 
    } 
} 
+0

Pourriez-vous nous montrer un (réduit) présentant l'exception? Cela peut être un problème avec la façon dont vous appelez 'GetWindowText'. Puisque vous voulez lire le texte d'une fenêtre du même processus, pourquoi n'utilisez-vous pas l'API managée à la place? –

+0

@AvidProgrammer: Votre code est différent de celui de nobugz. Il vous manque pour initialiser 'StringBuilder' avec une capacité initiale et passer exactement cette capacité comme valeur de' nMaxCount' à la fonction 'GetWindowText'. Cela devrait faire l'affaire. Si vous ne le faites pas, votre objet String Builder a un tampon vide et GetWindowText ne parvient pas à écrire dessus (et en tant que nœud secondaire pour les écritures futures: indentez votre code de 4 espaces ou appuyez sur le bouton * Format as Code * le code bien formaté). –

+0

@divo: Merci de montrer la différence. Définir la capacité du générateur de chaînes et envoyer le même à la fonction api a fait l'affaire. –

Répondre

7

Vous obtenez cette exception car votre appel GetWindowText() a corrompu le tas collecté par le garbage. Facile à faire lorsque vous passez une chaîne au lieu d'un StringBuilder ou oubliez d'initialiser StringBuilder.

La Voie droite: échantillon

[DllImport("user32.dll", CharSet = CharSet.Unicode)] 
    private static extern bool GetWindowText(IntPtr hWnd, StringBuilder buffer, int buflen); 
... 
    var sb = new StringBuilder(666); 
    if (GetWindowText(handle, sb, sb.Capacity)) { 
    string txt = sb.ToString(); 
    //... 
    } 
+0

J'utilise le constructeur de chaîne et l'ai initialisé aussi. Seul changement est J'utilise charset comme CharSet.Auto. Sera-ce un problème? –

+0

Avez-vous une référence pour votre dernière déclaration? J'ai utilisé GetWindowText avec succès pour récupérer la légende de HWNDs hors-proc et selon la section de remarques ici (http://msdn.microsoft.com/en-us/library/ms633520%28VS.85%29. aspx) cela ne devrait pas être un problème non plus. –

+0

Juste celui-ci: * Cette fonction ne peut pas récupérer le texte d'un contrôle d'édition dans une autre application. * Je mettrai à jour mon message, merci. –