尝试从user32.dll的GetWindowText()读取窗口时发生未处理的“System.ExecutionEngineException”类型异常

时间:2010-01-06 13:45:27

标签: c# user32

在我的应用程序中,我正在阅读同一进程的窗口文本。我正在使用User32.dll的GetWindowText。但是当它试图调用该方法时,我收到异常“aaaa.exe中发生了'System.ExecutionEngineException'类型的未处理异常”。我在哪里可以看到确切的错误。为什么我得到这个例外。

我的代码如下。

[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 个答案:

答案 0 :(得分: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();
    //...
  }