Необработанное исключение типа System.ExecutionEngineException, возникающее при попытке прочитать окно из GetWindowText () файла user32.dll - PullRequest
2 голосов
/ 06 января 2010

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

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

[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
    }
}

1 Ответ

7 голосов
/ 06 января 2010

Вы получаете это исключение, потому что ваш вызов 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();
    //...
  }
...