rt
发现前面一些句柄的文本能正常获取,到了某个句柄那里,程序自动退出
class Program
{
public delegate bool CallBack(int hwnd, int lParam);
[DllImport("user32")]
public static extern int EnumWindows(CallBack x, int y);
[DllImport("user32")]
public extern static int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
static void Main(string[] args)
{
CallBack myCallBack = new CallBack(Report);
EnumWindows(myCallBack, 0);
Console.ReadKey();
} public static bool Report(int hwnd, int lParam)
{
string name = "";
StringBuilder windowname = new StringBuilder();
if (GetWindowText(hwnd, windowname, 5000) > 0)
{
name = windowname.ToString();
}
Console.Write("Window handle is :"+hwnd+"名字为"+name+"\n");
return true; }
}
上面是控制台应用程序
是写的有问题还是Windows有句柄不让获取name的,把GetWindowText(hwnd, windowname, 5000)去掉,可以正常获取所有句柄。但获取name就有问题了
发现前面一些句柄的文本能正常获取,到了某个句柄那里,程序自动退出
class Program
{
public delegate bool CallBack(int hwnd, int lParam);
[DllImport("user32")]
public static extern int EnumWindows(CallBack x, int y);
[DllImport("user32")]
public extern static int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
static void Main(string[] args)
{
CallBack myCallBack = new CallBack(Report);
EnumWindows(myCallBack, 0);
Console.ReadKey();
} public static bool Report(int hwnd, int lParam)
{
string name = "";
StringBuilder windowname = new StringBuilder();
if (GetWindowText(hwnd, windowname, 5000) > 0)
{
name = windowname.ToString();
}
Console.Write("Window handle is :"+hwnd+"名字为"+name+"\n");
return true; }
}
上面是控制台应用程序
是写的有问题还是Windows有句柄不让获取name的,把GetWindowText(hwnd, windowname, 5000)去掉,可以正常获取所有句柄。但获取name就有问题了
StringBuilder windowname = new StringBuilder(5000);
所以,问题可能处在你那5000是否设得过大了。或者像4楼那样,初始化的时候指定Capacity为5000,虽然有点浪费。
准确一点说,建立一个stringbuilder时,是在.net的托管内存上建立的,stringbuilder会自动扩充它内部缓冲区的长度。
直接调用GetWindowText时,.net会把它复制(marshal)到非托管内存,且不会自动扩充。