C# 下使用 GetWindowTextW 出错,怎么解决?

来源:百度知道 编辑:UC知道 时间:2024/06/07 20:38:58
环境是:VS2008 + Vista

主要代码:
//使用 API
[DllImport("User32.dll")]
public static extern int GetWindowTextW(IntPtr hWnd, out StringBuilder lpString, int nMaxCount);
//重载
public static string GetWindowTextW(IntPtr hWnd)
{
StringBuilder outputString = new StringBuilder(255);
GetWindowTextW(hWnd, out outputString, outputString.Capacity);
return outputString.ToString();
}

异常:
捕捉到 System.AccessViolationException
Message="尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
StackTrace:
在 GetWindowTextW(IntPtr hWnd, StringBuilder& lpString, Int32 nMaxCount)
……

程序已经有管理员权限,有人说是 Ansi 的问题,不知怎么解决?
我目的是用它来获取按钮的文本。网上有人说是Vista把这个限制了,但是我在SPY++却可以看到标题。另外经测试,GetClassNameW 也一样异常。

[DllImport("C:\\Windows\\System32\\User32.dll")]
public static extern int GetWindowTextW(IntPtr hWnd, out StringBuilder lpString, int nMaxCount);

public static string GetWindowTextW(IntPtr hWnd)
{
StringBuilder outputString = new StringBuilder(255);
GetWindowTextW(hWnd, out outputString, outputString.Capacity);
return outputString.ToString();
}

static void Main(string[] args)
{
GetWindowTextW(new IntPtr(4044));
}

我这里运行起来是没有问题的...是不是杀毒软件之类的毛病?