2010-01-06 2 views
2

В моем приложении я читаю текст окна для того же процесса. Я использую GetWindowText из User32.dll. Но когда он пытается вызвать метод, я получаю исключение «Необработанное исключение типа« System.ExecutionEngineException »произошло в aaaa.exe». Где я могу увидеть точную ошибку. И почему я получаю это исключение.Необработанное исключение типа «System.ExecutionEngineException», возникающее При попытке прочитать окно из GetWindowText() user32.dll

Мой код такой, как показано ниже.

[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

Не могли бы вы показать нам (пониженная) образец экспонирование исключение? Возможно, это может быть проблема с тем, что вы называете «GetWindowText». Поскольку вы хотите прочитать текст из окна того же процесса, почему бы вам не использовать управляемый API? –

+0

@AvidProgrammer: Ваш код отличается от образца nobugz. Вам не хватает инициализировать 'StringBuilder' с начальной пропускной способностью и передать именно эту емкость как значение' nMaxCount' функции 'GetWindowText'. Это должно делать свое дело. Если вы этого не сделаете, ваш объект строкового построителя имеет пустой буфер, и GetWindowText не сможет его записать (и в качестве бокового узла для будущих проводок: отложите свой код на 4 пробела или нажмите кнопку * Format as Code *, что сделает код красиво отформатирован). –

+0

@divo: Спасибо, что указали разницу. Настройка производительности строкового построителя и отправка его в функцию api сделала трюк. –

ответ

7

Вы получаете это исключение, потому что ваш вызов GetWindowText() исказил кучу мусора. Легко делать, когда вы передаете строку вместо StringBuilder или забываете инициализировать StringBuilder.

Правильный путь:

[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

Я использую построитель строк и инициализировал его также. Только изменение - я использую charset как CharSet.Auto. Будет ли это проблемой? –

+0

У вас есть ссылка для вашего последнего заявления? Я успешно использовал GetWindowText для получения заголовка HWND вне процесса и в соответствии с разделом примечаний здесь (http://msdn.microsoft.com/en-us/library/ms633520%28VS.85%29. aspx), это тоже не должно быть проблемой. –

+0

Только этот: * Эта функция не может получить текст элемента управления редактирования в другом приложении. * Я обновлю сообщение, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^